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.
For example, given s = "aab",
Return
[
["aa","b"],
["a","a","b"]
]
Analysis
Back tracking (DFS) problem,基本模式为:
- 判断条件:在哪种情况下可以吧list加入result,返回
- for 循环,变量i:
- 取一个subset放入list(符合一定条件)
- call dfs 函数,pos变量变为与i相关
- 把subset remove
对于这道题,用隔板的思想。pos代表从哪个字幕开始判断。循环中的i用来代表隔板的位置。
- 判断条件:如果隔板已经到最后了,那么说明成功了,把这个list放到result里去。
- for循环隔板位置
- 选择pos到i的一段substring
- 如果substring不是palindrome,continue
- 如果是palindrome,则把这个substring加入到list里去
- call dfs函数,新的pos是i,意思是看隔板后面的substring情况。
- 把现有substring从list里除去。
s="aab"
for: substring =
"a"; pass "ab"; "a", "b" or "ab"
"aa"; pass "b"
"aab": not palindrome
Code
public class Solution {
public List<List<String>> partition(String s) {
List<List<String>> result = new ArrayList<List<String>>();
List<String> list = new ArrayList<String>();
if(s.length()==0) {return result;}
backTrack(list, result, s, 0);
return result;
}
private void backTrack(List<String> list, List<List<String>> result, String s, int pos){
if(pos == s.length()) {
result.add(new ArrayList<String>(list));
return;
}
for(int i=pos+1; i<=s.length(); i++){
String substr = s.substring(pos, i);
if(!isPalindrome(substr)){continue;}
list.add(substr);
backTrack(list, result, s, i);
list.remove(list.size()-1);
}
}
private boolean isPalindrome(String s){
//note empty string cannot be put in the result in this question, so it is regarded as not palindrome
if (s==null || s.isEmpty()) {return false;}
int n = s.length();
for(int i=0; i<n/2; i++){
if (s.charAt(i)!=s.charAt(n-1-i)) {return false;}
}
return true;
}
}
Notes
- string.substring(start, end): 包括start指向的char,不包括end指向的char