Leetcode 139、单词拆分

思路:动态规划
- dp[i]表示以 i - 1 位置结尾的字符串是否可以由wordDict里面的字符串拼接得到
- 递推公式:dp[i]是否可以拼接得到,需要看 j - 1 ~ i - 1 部分的字符串是否在wordDict里面并且dp[j - 1]之前的字符串是否可以得到,并且这里可以用到 || 操作
- 初始化:dp数组长度为 len + 1, dp[0] = true, 表示空字符串可以得到
- 遍历顺序:从前向后遍历
时间复杂度:O(n * n)
- 字符串长度为n,一共有 O(n) 个状态需要计算,每次计算需要枚举 O(n) 个分割点,哈希表判断一个字符串是否出现在给定的字符串列表需要 O(1)
的时间,因此总时间复杂度为 O(n^2)。
空间复杂度:O(n)
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
Set<String> wordDictSet = new HashSet(wordDict);
int len = s.length();
boolean[] dp = new boolean[len + 1];
dp[0] = true;
for(int i = 1; i <= len; i++) {
for(int j = i; j >= 1; j--) {
if(wordDictSet.contains(s.substring(j - 1, i))) {
dp[i] = dp[i] || dp[j - 1];
}
}
}
return dp[len];
}
}