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"] ]
将一个字符串,进行分段,每段都是一个回文。
列出所有的分法。
基本思路:
深度优先递归。
在剩余字符中,逐步偿试,找一个回文子串;若找到,则刨掉此回文后,在剩余的子符继续进行前面的操作。
若剩余字符为空,则找到一个组合。
判断一个字串是否是回文,用头尾两个指针,向中间移动。
在leetcode上实际执行时间为12ms。
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> ans(1);
dfs(ans, s, 0);
ans.pop_back();
return ans;
}
void dfs(vector<vector<string>> &ans, const string &s, int start) {
if (start == s.size()) {
ans.push_back(ans.back());
return;
}
for (int i=start; i<s.size(); i++) {
if (isPalindrome(s, start, i)) {
ans.back().push_back(s.substr(start, i-start+1));
dfs(ans, s, i+1);
ans.back().pop_back();
}
}
}
bool isPalindrome(const string &s, int start, int end) {
while (start <= end && s[start] == s[end]) {
++start;
--end;
}
return start > end;
}
};