思路:
首先想到用深度優先,每次遞歸傳入之前的路徑鏈表,以及剩下的字符串。對剩下的字符串再次劃分成兩部分part1、part2,先判斷part1是否迴文然後將part1放入路徑鏈表,和part2一起傳入再次遞歸。
/*List<List<String>> lists = new ArrayList<List<String>>();
public List<List<String>> partition(String s) {
if (s == null) return lists;
if (s.length() == 0) return lists;
for (int i = 1; i < s.length(); i++) {
List<String> list = new ArrayList<String>();
String part1 = s.substring(i);
String part2 = s.substring(0,i);
list.add(part2);
dfs(part1, list);
}
return lists;
}
public void dfs(String s, List<String> list) {
if (s.length() == 0) {
lists.add(list);
return;
}
for (int i = 1; i <= s.length(); i++) {
List<String> l = new ArrayList<String>(list);
if(isPalindrome(s.substring(0,i))){
l.add(s.substring(0, i));
dfs(s.substring(i), l);
}
}
}*/
public boolean isPalindrome(String s){
for(int i=0;i<=(s.length()-1)/2;i++){
if(s.charAt(i)!=s.charAt(s.length()-1-i)){
return false;
}
}
return true;
}
結果發現超時,不能和之前的backtrackng一樣通過dfs來解決。需要把遞歸轉化成動態規劃。
2.建立hashmap<Integer,List<List<String>>hm,key=i對應的鍵值表示到String s第i個元素的所有迴文組合。從頭至尾將回文組合填入。假設要填入key=j對應的鍵值,我們遍歷key=0->j-1對應的鍵值,判斷key+1,j的字串如果迴文,則生成新的list並放入鍵值對應的集合。
public boolean isPalindrome(String s){
for(int i=0;i<=(s.length()-1)/2;i++){
if(s.charAt(i)!=s.charAt(s.length()-1-i)){
return false;
}
}
return true;
}
public List<List<String>> partition(String s){
HashMap<Integer,List<List<String>>>hm=new HashMap<Integer,List<List<String>>>();
for(int i=0;i<s.length();i++){
List<List<String>>current;
if(isPalindrome(s.substring(0,i+1))){
List<List<String>>lists=new ArrayList<List<String>>();
List<String>list=new ArrayList<String>();
list.add(s.substring(0,i+1));
lists.add(list);
hm.put(i,lists);
current=lists;
}else{
current=new ArrayList<List<String>>();
}
for(int j=0;j<i;j++){
if(hm.containsKey(j)&&isPalindrome(s.substring(j + 1, i + 1))){
List<List<String>>pre=hm.get(j);
for(List<String>l1:pre){
List<String>l2=new ArrayList<String>(l1);
l2.add(s.substring(j+1,i+1));
current.add(l2);
}
}
}
if(!current.isEmpty())hm.put(i,current);
}
if(hm.containsKey(s.length()-1))return hm.get(s.length()-1);
return new ArrayList<List<String>>();
}