回文分割

回文分割

问题

这个题目说的是,给你一个字符串,你要把它分割成子串,并且每个子串都是回文串。你要返回所有可能的子串集合。

比如说,给你的字符串是:

aad

它有两种可能的分割方法。一种是分割成 aa 和 d。aa 是回文串,d 作为单个字符也是回文串。

另一种是分割成 a,a 和 d,3 个子串都是单字符的回文串。

代码

public class AlgoCasts {

  private void partition(String s, int start, boolean[][] d,
                         List<List<String>> result, List<String> elem) {
    if (start >= s.length()) {
      result.add(new ArrayList<>(elem));
    } else {
      for (int end = start; end < s.length(); ++end) {
        if (d[start][end]) {
          elem.add(s.substring(start, end+1));
          partition(s, end+1, d, result, elem);
          elem.remove(elem.size()-1); // T: O(1)
        }
      }
    }
  }

  // Time: O(2^n), Space: O(n^2)
  public List<List<String>> partition(String s) {
    List<List<String>> result = new ArrayList<>();
    if (s == null || s.length() == 0) return result;
    int n = s.length();
    boolean[][] d = new boolean[n][n];

    for (int i = n-1; i >= 0; --i) {
      for (int j = i; j < n; ++j) {
        if (i == j) d[i][j] = true;
        else if (i+1 == j) d[i][j] = s.charAt(i) == s.charAt(j);
        else d[i][j] = s.charAt(i) == s.charAt(j) && d[i+1][j-1];
      }
    }

    partition(s, 0, d, result, new ArrayList<>());
    return result;
  }

}

  转载请注明: ForwardXu 回文分割

 上一篇
用有序数组构建二叉搜索树 用有序数组构建二叉搜索树
用有序数组构建二叉搜索树问题 这个题目说的是,给你一个递增排序的数组,你要用它构建一棵平衡的二叉搜索树。所谓平衡,是指对于这棵二叉搜索树上的每一个节点,它左右子树的高度差不能大于 1。 比如说,给你的递增数组是: 1, 2, 4, 8,
2018-12-09
下一篇 
反转字符串 反转字符串
反转字符串问题 这个题目说的是,给你一个字符串,你要写一个函数左右反转它。然后返回反转后的字符串。 比如说给你的字符串是: abcde 你要返回左右反转后的字符串: edcba 代码 public class AlgoCasts {
2018-12-09
  目录