Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
Example
Given s = "aab"
, return:
[
["aa","b"],
["a","a","b"]
]
分析
(1)DFS深搜
(2)DFS改进,对于重复判断子串是否为回文,可以存起来,不用每次都计算
(3)用动态规划,dp[i][i] 记录串 i~j 是否为回文,然后调用 DFS 遍历各种情况
代码
DFS递归
public class Solution {
/**
* @param s: A string
* @return: A list of lists of string
*/
public List<List<String>> partition(String s) {
int n = s.length();
search(new ArrayList<String>(), s);
return resList;
}
List<List<String>> resList = new ArrayList<List<String>>();
void search(List<String> res, String s){
int n = s.length();
if(n==0){
List<String> tmp = new ArrayList<String>();
//Collections.copy(tmp, res);
tmp.addAll(res);//一定要复制值再加入,如果直接加入res,由于他是引用,值会随着递归一直变,最后可定为空
resList.add(tmp);
}
for(int len=1; len<=n; len++){
String sub = s.substring(0, len);
if(isPalindrome(sub)){
res.add(sub);
search(res, s.substring(len, n));
res.remove(res.size()-1);
}
}
}
boolean isPalindrome(String s){
int i=0, j=s.length()-1;
while(i<j){
if(s.charAt(i)!=s.charAt(j))
return false;
i++;
j--;
}
return true;
}
}