回溯算法
递归,把大问题分解成小问题,子问题
class Solution {
private boolean check(String s)
{
int l=0,r=s.length()-1;
while(l<r)
{
if(s.charAt(l)!=s.charAt(r))
{
return false;
}
l++;
r--;
}
return true;
}
private void backTrack(List<List<String>> res,String s,ArrayList<String> tmp)
{
if(s==null||s.length()==0) res.add(new ArrayList<>(tmp));
for(int i=1;i<=s.length();++i)
{
String temp = s.substring(0,i);
if(check(temp))
{
tmp.add(temp);
backTrack(res, s.substring(i,s.length()), tmp);
tmp.remove(tmp.size()-1);
}
}
}
public List<List<String>> partition(String s) {
List<List<String>> res = new LinkedList();
backTrack(res, s, new ArrayList<>());
return res;
}
}
把字符串每次分成两部分
左边部分和右边部分
如果左边是回文,那么探索右边
同时重复这个步骤
举例:
先定住 a不动,看 ab是不是回文
递归到下一次 又定住 a不动,看b是不是回文
于是 得到 [a,a,b] 的结果
回溯到上一层
定住 aa不动,看b是不是回文
是! 得到 [aa,b]
回溯到上层
定住 aab,很明显不是回文,于是过程完成,结束