题目
给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。
说明:
拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"] 输出: true 解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。
动态规划
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Main main = new Main();
List<String> tt = new ArrayList<>();
tt.add("leet");
tt.add("code");
main.wordBreak("leetcode", tt);
}
public boolean wordBreak(String s, List<String> wordDict) {
if (wordDict.contains(s)) {
return Boolean.TRUE;
}
boolean [] dp = new boolean[s.length()];
for (int i = 0; i < s.length(); i ++) {
for (int j = 0; j <= i; j ++) {
String temp = s.substring(j , i + 1);
if (wordDict.contains(temp) && (j - 1 < 0 || dp[j - 1])) {
dp[i] = Boolean.TRUE;
break;
}
}
}
return dp[s.length() - 1];
}
}
基本思路
- 这道题目发现和最小拆分回文串2的思路一致, 找状态转移方程的时候, 需要枚举包含当前字符串的符合条件的字符串, 然后问题就变成了前面一个子问题. 即当计算dp[j]的时候, 枚举0...j, 1...j, 2...j等等哪些符合要求, 如果存在符合要求的k..j, 那么dp[j] = dp[k]
我们需要枚举 s[0..i-1]中的分割点 j ,看 s[0..j-1]组成的字符串 s_1和 s[j..i-1]组成的字符串 s_2是否都合法,如果两个字符串均合法,那么就合法