leetcode 140. Word Break II | 140. 单词拆分 II(动态规划)

朴灿烈づ我的快乐病毒、 2022-08-31 11:05 271阅读 0赞

题目

https://leetcode.com/problems/word-break-ii/
在这里插入图片描述

题解

由 leetcode 139. Word Break | 139. 单词拆分(动态规划) 改造而来。
在这里插入图片描述
dp 过程示例:

在这里插入图片描述

  1. class Solution {
  2. public List<String> wordBreak(String s, List<String> wordDict) {
  3. HashSet<String> dict = new HashSet<>();
  4. for (String word : wordDict) {
  5. dict.add(word);
  6. }
  7. int n = s.length();
  8. ArrayList<int[]>[][] dp = new ArrayList[n + 1][n + 1];
  9. for (int i = 1; i <= n; i++) {
  10. for (int j = i; j <= n; j++) {
  11. int L = j - i;
  12. int R = j;
  13. dp[L][R] = new ArrayList<>();
  14. if (dict.contains(s.substring(L, R))) {
  15. ArrayList<int[]> t = new ArrayList<>();
  16. t.add(new int[]{ L, R});
  17. dp[L][R] = t;
  18. }
  19. for (int M = L + 1; M < R; M++) {
  20. // [L...M) + [M...R)
  21. if (dp[L][M] != null && dp[L][M].size() > 0 && dp[M][R] != null && dp[M][R].size() > 0) {
  22. dp[L][R].add(new int[]{ L, M});
  23. dp[L][R].add(new int[]{ M, R});
  24. }
  25. }
  26. }
  27. }
  28. Set<String> res = join(dp, 0, n, s);
  29. return new ArrayList<>(res);
  30. }
  31. public Set<String> join(ArrayList<int[]>[][] dp, int L, int R, String s) {
  32. ArrayList<int[]> pair = dp[L][R];
  33. Set<String> res = new HashSet<>();
  34. int i = 0;
  35. if (pair.size() % 2 == 1) {
  36. res.add(s.substring(L, R));
  37. i = 1;
  38. }
  39. for (; i + 1 < pair.size(); i += 2) {
  40. Set<String> lSet = join(dp, L, pair.get(i)[1], s);
  41. Set<String> rSet = join(dp, pair.get(i + 1)[0], R, s);
  42. for (String l : lSet) {
  43. for (String r : rSet) {
  44. res.add(l + " " + r);
  45. }
  46. }
  47. }
  48. return res;
  49. }
  50. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,271人围观)

还没有评论,来说两句吧...

相关阅读