You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串分割为最大数量有效单词问题及代码调试求助

问题:字符串分割为最大数量的有效单词

给定字符串s和有效单词字典d,需要确定该字符串能分割成的最大有效单词数量。以下是我尝试的代码,但未得到预期结果:

def word_split_dp(s):
    n = len(s)
    ans = [0]*n
    # base case
    ans[0] = 0
    for i in range(1, len(s)):
        ans[i] = float('-inf')
        for j in range(1, i-1):
            ans[i]= max(ans[i], ans[i-j] + wordcheck(s,i,j))
   
    print(ans)
    return ans[n-2]
       
def wordcheck(s,i,j):
    
    for word in dict:
        start = i-j+1
        if(s[start:i] == word):
            return 1
        else:
            return float('-inf')
        

print(word_split_dp(s))

代码问题分析

  • 参数传递缺失:word_split_dp未接收字典参数,wordcheck直接使用全局dict,导致无法传入自定义的有效单词字典。
  • 索引逻辑错误:
    • ans数组长度为n,但返回ans[n-2],对应字符串倒数第二个位置的状态,不符合“整个字符串的最大单词数”需求。
    • j的循环范围range(1, i-1)会导致i≤2时循环直接跳过,无法检查所有可能的分割点。
  • 单词检查逻辑错误:wordcheck中第一个单词不匹配就直接返回-inf,未遍历完所有字典单词就终止判断,会漏掉匹配的可能。
  • DP状态定义不合理:ans[i]定义为第i个字符位置的状态,不如定义dp[i]为前i个字符的最大有效单词数直观,容易混淆索引对应关系。

修正后的代码

def max_word_split(s, word_dict):
    n = len(s)
    # dp[i] 表示前i个字符能分割出的最大有效单词数
    dp = [float('-inf')] * (n + 1)
    dp[0] = 0  # 空字符串的单词数为0
    
    for i in range(1, n + 1):
        # 遍历所有可能的分割点j
        for j in range(i):
            if dp[j] != float('-inf') and s[j:i] in word_dict:
                dp[i] = max(dp[i], dp[j] + 1)
    
    # 无法分割时返回0,可根据需求调整
    return dp[n] if dp[n] != float('-inf') else 0

# 示例调用
s = "leetcode"
word_dict = {"leet", "code", "lee", "t"}
print(max_word_split(s, word_dict))  # 输出:3(分割为"lee"+"t"+"code")

修正说明

  • 调整DP数组定义:dp[i]对应前i个字符的状态,dp[0]初始化为0(空字符串的基准情况)。
  • 遍历所有分割点:对于每个i,检查所有j从0到i-1,若s[j:i]在字典中且dp[j]是可达状态,就更新dp[i]为更大值。
  • 简化单词检查:直接用in操作符判断子串是否在字典中,避免错误的循环判断。
  • 处理无法分割的情况:若最终dp[n]仍为-inf,说明字符串无法分割为有效单词,返回0。

内容的提问来源于stack exchange,提问作者Dogdigger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:10:16