题目

代码
//1.暴力递归 public boolean wordBreak(String s, List<String> wordDict) { return recur(s, s.length()); } public boolean recur(String s, int index) { if (index == 0) return true; for (int i = index - 1; i >= 0; i--) { if (recur(s, i) && wordDict.contains(s.substring(i, index))) return true; } return false; } //2.备忘录 int[] dp; public boolean wordBreak(String s, List<String> wordDict) { dp = new int[s.length()]; return recur(s, s.length()); } public boolean recur(String s, int index) { if (index == 0) return true; for (int i = index - 1; i >= 0; i--) { if (dp[i] != 0) { if (dp[i] == -1) continue; if (dp[i] == 1 && set.contains(s.substring(i, index))) return true; } boolean res = recur(s, i); dp[i] = res == true ? 1 : -1; if (res && wordDict.contains(s.substring(i, index))) return true; } return false; } //3.动态规划 public boolean wordBreak(String s, List<String> wordDict) { boolean[] dp = new boolean[s.length() + 1]; dp[0] = true; for (int i = 1; i <= s.length(); i++) { for (int j = i; j <= s.length(); j++) { dp[j] |= wordDict.contains(s.substring(i - 1, j)) && dp[i - 1]; if (dp[s.length()]) return true; } } return false; } //如果求组合数就是外层for循环遍历物品,内层for遍历背包。 //如果求排列数就是外层for遍历背包,内层for循环遍历物品。 //4.完全背包方面 public boolean wordBreak(String s, List<String> wordDict) { boolean[] dp = new boolean[s.length() + 1]; dp[0] = true; for (int i = 1; i <= s.length(); i++) { //遍历背包 for (int j = 0; j < i; j++) { //遍历物品 if (dp[j] && wordDict.contains(s.substring(j, i))) { dp[i] = true; break; } } } return dp[s.length()]; }
单词拆分