题目

image.png

代码

  1. //1.暴力递归
  2. public boolean wordBreak(String s, List<String> wordDict) {
  3. return recur(s, s.length());
  4. }
  5. public boolean recur(String s, int index) {
  6. if (index == 0) return true;
  7. for (int i = index - 1; i >= 0; i--) {
  8. if (recur(s, i) && wordDict.contains(s.substring(i, index)))
  9. return true;
  10. }
  11. return false;
  12. }
  13. //2.备忘录
  14. int[] dp;
  15. public boolean wordBreak(String s, List<String> wordDict) {
  16. dp = new int[s.length()];
  17. return recur(s, s.length());
  18. }
  19. public boolean recur(String s, int index) {
  20. if (index == 0) return true;
  21. for (int i = index - 1; i >= 0; i--) {
  22. if (dp[i] != 0) {
  23. if (dp[i] == -1) continue;
  24. if (dp[i] == 1 && set.contains(s.substring(i, index))) return true;
  25. }
  26. boolean res = recur(s, i);
  27. dp[i] = res == true ? 1 : -1;
  28. if (res && wordDict.contains(s.substring(i, index)))
  29. return true;
  30. }
  31. return false;
  32. }
  33. //3.动态规划
  34. public boolean wordBreak(String s, List<String> wordDict) {
  35. boolean[] dp = new boolean[s.length() + 1];
  36. dp[0] = true;
  37. for (int i = 1; i <= s.length(); i++) {
  38. for (int j = i; j <= s.length(); j++) {
  39. dp[j] |= wordDict.contains(s.substring(i - 1, j)) && dp[i - 1];
  40. if (dp[s.length()]) return true;
  41. }
  42. }
  43. return false;
  44. }
  45. //如果求组合数就是外层for循环遍历物品,内层for遍历背包。
  46. //如果求排列数就是外层for遍历背包,内层for循环遍历物品。
  47. //4.完全背包方面
  48. public boolean wordBreak(String s, List<String> wordDict) {
  49. boolean[] dp = new boolean[s.length() + 1];
  50. dp[0] = true;
  51. for (int i = 1; i <= s.length(); i++) { //遍历背包
  52. for (int j = 0; j < i; j++) { //遍历物品
  53. if (dp[j] && wordDict.contains(s.substring(j, i))) {
  54. dp[i] = true;
  55. break;
  56. }
  57. }
  58. }
  59. return dp[s.length()];
  60. }

单词拆分