题目链接:https://leetcode.com/problems/palindrome-partitioning/
题目:
s, partition s
s.
s = "aab"
,
Return
[ ["aa","b"], ["a","a","b"] ]
思路:
回溯,判断对每一种切分是否是回文串,剪枝函数是当第一个子串不是回文串时 不往下递归了。
ps:去年做过这题,当时脑子还停留在其他题上,居然想出个用回溯法计算出所有切分的可能,然后对这些切分后的字符串进行判断,= =ORZ
算法:
List<List<String>> results = new ArrayList<List<String>>();
public List<List<String>> partition(String s) {
if (s.length() == 0) {
return results;
}
dfs(s, 0, new ArrayList<String>());
return results;
}
public void dfs(String s, int start, List<String> res) {
if (start == s.length()) {
results.add(new ArrayList<String>(res));
return;
}
for (int i = start + 1; i <= s.length(); i++) {
String left = s.substring(start, i);
if (isPalindrome(left)) {
res.add(left);
dfs(s, i, res);
res.remove(res.size()-1);
}
}
}
boolean isPalindrome(String s) {
boolean flag = true;
int i = 0, j = s.length() - 1;
char c[] = s.toCharArray();
while (i < j) {
if (c[i] != c[j]) {
flag = false;
break;
} else {
i++;
j--;
}
}
return flag;
}