LeetCode 132. Palindrome Partitioning
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
Example:
Input: "aab"
Output:
[
["aa","b"],
["a","a","b"]
]
思路还是一样,n的答案依赖于0~n-1的答案
public List<List<String>> partition(String s) {
List<List<List<String>>> allResult = new ArrayList<>();
List<List<String>> res = new ArrayList<>();
if (s.length() == 0) return res;
List<String> l = new ArrayList<>();
l.add(s.substring(0,1));
res.add(l);
allResult.add(res);
for (int i = 1; i < s.length(); i++) {
List<List<String>> curRes = new ArrayList<>();
for (int p = 0; p <= i; p++) {
String curs = s.substring(p,i+1);
if (isPalindrome(curs)) {
List<List<String>> pre = new ArrayList<>();
List<String> a = new ArrayList<>();
pre.add(a);
if (p != 0) pre = allResult.get(p-1);
for (List<String> ll : pre) {
List<String> lll = new ArrayList<>(ll);
lll.add(curs);
curRes.add(lll);
}
}
}
allResult.add(curRes);
}
List<List<String>> result = allResult.get(allResult.size() - 1);
return result;
}
private boolean isPalindrome(String s) {
if (s.length() <= 1) return true;
int l = 0;
int r = s.length() - 1;
while (l < r) {
if (s.charAt(l++) != s.charAt(r--)) {
return false;
}
}
return true;
}
更优的解法:先把可以构成palindrome的【i,j】 pair存放起来,需要的时候直接用。思路还是和上面一样,n的答案,依赖于0~n-1的答案。至于怎么依赖,怎么组合,得到n的答案就是每道题解题的关键。
class Solution {
public List<List<String>> partition(String s) {
List<List<String>> res = new ArrayList<>();
if (s.length() == 0) return res;
List<List<List<String>>> allResult = new ArrayList<>();
int len = s.length();
boolean[][] palindrome = new boolean[len][len];
getPalindromeIndex(palindrome, s);
res.add(new ArrayList<>());
allResult.add(res);
for (int i = 0; i < s.length(); i++) {
List<List<String>> result = new ArrayList<>();
for (int j = 0; j <= i; j++) {
if (palindrome[j][i]) {
List<List<String>> pre = allResult.get(j);
for (List<String> list : pre) {
List<String> current = new ArrayList<>(list);
current.add(s.substring(j, i+1));
result.add(current);
}
}
}
allResult.add(result);
}
return allResult.get(allResult.size()-1);
}
public void getPalindromeIndex(boolean[][] palindrome, String s) {
for (int i = 0; i < s.length(); i++) {
palindrome[i][i] = true;
helper(palindrome, s, i-1, i+1);
helper(palindrome, s, i, i+1);
}
}
public void helper(boolean[][] palindrome, String s, int start, int end) {
while (start >= 0 && end < s.length()) {
if (s.charAt(start) == s.charAt(end)) palindrome[start][end] = true;
else break;
start--;
end++;
}
}
}