随想录训练营Day46 | DP - - 139.单词拆分
标签: LeetCode闯关记
139.单词拆分(好难没想清楚)
HashSet
结构
HashSet
是一种基于哈希表实现的集合,它能够提供O(1)
时间复杂度的添加、删除和查找操作。
在这个问题中,我们需要经常检查一个字符串是否包含在单词字典中。如果我们直接使用 List 来存储单词字典,则需要遍历整个列表才能找到一个单词,时间复杂度为 O(n)。但是,如果我们将单词字典存储在 HashSet 中,只需要 O(1) 的时间复杂度就可以判断一个单词是否在单词字典中,因此使用 HashSet 可以大大提高算法效率。
另外,由于 HashSet 本身不允许重复元素,因此如果单词字典包含重复单词,则 HashSet 只会保留其中一个副本,这可以避免重复计算,提高算法效率。
思路(图插不进去)
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
boolean[] dp = new boolean[s.length()+1];
dp[0] = true;
HashSet<String> dic = new HashSet<>(wordDict);
for (int i = 1; i < dp.length && !dp[i]; i++) {//一旦 valid[i] 为 true,就不需要再进行额外的计算了
for (int j = 0; j < i; j++) {//排列数 所以先背包后物品
if(dp[j] == true && dic.contains(s.substring(j,i))){
dp[i] = true;//递推公式
}
}
}
return dp[s.length()];
}
}
复杂度分析
总的时间复杂度:O(n^3)
- 该代码的时间复杂度为
O(n^2)
, 其中 n 是字符串的长度。外层循环遍历了字符串中的每个位置,内层循环遍历了该位置之前的所有可能的分割点。在内层循环中,substring() 方法的时间复杂度是O(n)
。
空间复杂度主要取决于 valid 数组和 set 集合的大小,它们的大小都是O(n)
级别的。因此,总的空间复杂度也是O(n)