给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: "aab"
输出:
[
["aa","b"],
["a","a","b"]
]
这个题还是用DFS的方法来做,基本思路就是寻找子串的思路,只需要加一个函数来判断是否是回文串即可。
C++源代码:
class Solution {
public:
vector<vector<string>> partition(string s) {
vector<vector<string>> res;
vector<string> out;
DFS(s, 0, out, res);
return res;
}
void DFS(string s, int start, vector<string>& out, vector<vector<string>>& res){
if(start == s.size()) {
res.push_back(out);
return;
}
for(int i=start;i<s.size();i++){
if(!isPalindrom(s, start, i)) continue;
out.push_back(s.substr(start, i-start+1));
DFS(s, i+1, out, res);
out.pop_back();
}
}
bool isPalindrom(string s, int start, int end){
while(start<end){
if(s[start]!=s[end]) return false;
start++;
end--;
}
return true;
}
};
python3源代码:
class Solution:
def partition(self, s: str) -> List[List[str]]:
res = []
out = []
self.DFS(s, 0, out, res)
return res
def DFS(self, s, start, out, res):
if start==len(s):
res.append(copy.deepcopy(out))
return
for i in range(start, len(s)):
if self.isPalindrom(s, start, i)==False:
continue
out.append(s[start:i+1])
self.DFS(s, i+1, out, res)
out.pop()
def isPalindrom(self, s, start, end):
while start<end:
if s[start]!=s[end]:
return False
start += 1
end -= 1
return True