问题:
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
For example, given s = "aab"
,
Return
[ ["aa","b"], ["a","a","b"] ]
解决:
① dfs。
class Solution { //10ms
public List<List<String>> partition(String s) {
List<List<String>> res = new ArrayList<>();
if (s == null || s.length() == 0) {
return res;
}
List<String> list = new ArrayList<>();
dfs(s,0,list,res);
return res;
}
public void dfs(String s,int i,List<String> list,List<List<String>> res){
if (i == s.length()) {
res.add(new ArrayList<String>(list));
return;
}
for (int j = i;j < s.length() ;j ++ ) {
String str = s.substring(i,j + 1);
if(isPalindrome(str)){
list.add(str);
dfs(s,j + 1,list,res);
list.remove(list.size() - 1);
}
}
}
public boolean isPalindrome(String s){
int low = 0;
int high = s.length() - 1;
while(low < high){
if (s.charAt(low) != s.charAt(high)) {
return false;
}
low ++;
high --;
}
return true;
}
}
② 动态规划。设dp[i][j] = true表示以i为起点,长度为j的子串是回文,等于false表示不是回文,那么求dp[i][j]的动态规划方程如下:
-
j = 1,dp[i][j] = true;
-
j = 2,dp[i][j] = (s[i]==s[i+1]),其中s是输入字符串
-
j > 2, dp[i][j] = dp[i+1][j-2] && (dp[i] == dp[i+j-1])(即判断s[m..n]是否是回文时:只要s[m+1...n-1]是回文并且s[m] = s[n],那么它就是回文,否则不是回文)
class Solution {//6ms
boolean[][] dp;
public List<List<String>> partition(String s){
char[] schar = s.toCharArray();
dp = new boolean[s.length()][s.length()];
for (int j = 0;j < s.length();j ++){//初始化标记数组
for (int i = 0;i <= j;i ++){
if (schar[i] == schar[j] && (j - i <= 2 || dp[i + 1][j - 1])){
dp[i][j] = true;
}
}
}
List<List<String>> res = new ArrayList<>();
List<String> list = new ArrayList<>();
dfs(s,0,list,res);
return res;
}
public void dfs(String s,int i,List<String> list,List<List<String>> res){
if (i == s.length()){
res.add(new ArrayList<String>(list));
return;
}
for (int j = i;j < s.length();j ++){
if (dp[i][j]){
list.add(s.substring(i,j + 1));
dfs(s,j + 1,list,res);
list.remove(list.size() - 1);
}
}
}
}