线性动态规划:单词拆分
字数 984 2025-10-28 08:36:45
线性动态规划:单词拆分
题目描述
给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判断 s 是否可以被拆分为一个或多个字典中单词的空格分隔序列。同一个单词可以被重复使用,字典中的单词不重复。
示例
输入:s = "leetcode", wordDict = ["leet", "code"]
输出:true
解释:"leetcode" 可以拆分为 "leet" 和 "code"。
解题思路
- 定义状态:设
dp[i]表示字符串s的前i个字符(即s[0:i])能否被拆分成字典中的单词。 - 状态转移:对于每个位置
i(从 1 到n),检查所有可能的拆分点j(0 ≤ j < i),若dp[j]为真且子串s[j:i]在字典中,则dp[i] = true。 - 初始条件:
dp[0] = true,表示空字符串默认可拆分。 - 最终结果:
dp[n]的值即为整个字符串s是否可拆分。
详细步骤
- 初始化长度为
n+1的布尔数组dp,全部设为false,dp[0] = true。 - 将
wordDict转换为哈希集合wordSet以便快速查询。 - 外层循环遍历
i从 1 到n(对应子串s[0:i]):- 内层循环遍历
j从 0 到i-1:- 若
dp[j]为真且s.substring(j, i)在wordSet中,则设置dp[i] = true并跳出内层循环(无需继续检查其他j)。
- 若
- 内层循环遍历
- 返回
dp[n]。
示例推导(s = "leetcode", wordDict = ["leet", "code"])
dp[0] = true(空字符串)i=4:检查j=0,dp[0]=true且 "leet" 在字典中 →dp[4]=truei=8:检查j=4,dp[4]=true且 "code" 在字典中 →dp[8]=true
最终dp[8]为 true,字符串可拆分。
复杂度分析
- 时间复杂度:O(n²),其中
n为字符串长度。 - 空间复杂度:O(n) 用于存储
dp数组和哈希集合。