给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: “aab”
输出:
[
["aa","b"],
["a","a","b"]
]
搜索问题主要使用回溯法。
回溯法思考的步骤:
1、画递归树;
2、根据自己画的递归树编码。
代码参考:
public List<List<String>> partition(String s) {
if(s.length() == 0)return res;
Deque<String> path = new LinkedList<>();
backTracking(s, 0, path);
return res;
}
public void backTracking(String s, int current, Deque<String> path){
if(current == s.length()){
res.add(new ArrayList<>(path));
}
for(int i=current;i<s.length();i++){
String sub = s.substring(current, i+1);
//非回文,舍弃
if(!isPalindrome(sub))continue;
path.addLast(sub);
backTracking(s, i+1, path);
path.removeLast();
}
}
public boolean isPalindrome(String s) {
if(s.length() < 2)return true;
int current = s.length()-1;
for(int i=0;i<s.length()&¤t>=0;i++){
char rt = Character.toLowerCase(s.charAt(current));
char lf = Character.toLowerCase(s.charAt(i));
if((rt<'a' || rt > 'z') && (rt<'0' || rt >'9')){
current--;
i--;
continue;
}
if((lf<'a' || lf > 'z') && (lf<'0' || lf >'9'))continue;
if(rt != lf)return false;
current--;
}
return true;
}