1. 问题理解与动态规划思路拆解
遇到字符串匹配问题时,我们首先需要明确题目要求。给定一个字符串s和一个单词字典wordDict,判断是否可以用字典中的单词(可重复使用)拼接出完整的s。这个问题看似简单,但直接暴力匹配会导致指数级的时间复杂度。
动态规划是解决这类重叠子问题的最佳选择。我们定义dp[i]表示字符串s的前i个字符能否被字典中的单词拼接而成。初始化时,dp[0]为true(空字符串可以被视为由0个单词组成)。对于每个位置i(1 ≤ i ≤ s.length()),我们检查所有可能的分割点j(0 ≤ j < i),如果dp[j]为true且s.substring(j,i)存在于字典中,那么dp[i]也为true。
这种方法的精妙之处在于:
- 将大问题分解为相互依赖的子问题
- 通过dp数组存储中间结果避免重复计算
- 时间复杂度优化到O(n²),其中n是字符串长度
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法实现与优化
2.1 基础DP实现解析
让我们深入分析提供的Java代码实现:
java复制class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
boolean[] dp = new boolean[s.length()+1];
dp[0] = true; // 空字符串base case
for(int i = 1; i <= s.length(); i++){
for(int j = i-1; j >= 0; j--){
String current = s.substring(j,i);
dp[i] = wordDict.contains(current) && dp[j];
if(dp[i]){
break; // 找到一个有效分割即可
}
}
}
return dp[s.length()];
}
}
几个关键点需要注意:
