Description
Given a string s, partition s such that every substring of the partition is a palindrome.
Return all possible palindrome partitioning of s.
Example:
Input:
"aab"
Output:
[
["aa","b"],
["a","a","b"]
]
分析
题目的意思是:给定一个字符串s,然后分解成若干个字串,使得每个字串都是回文子串,返回所有可能的形式。
- 如果是输出所有可能的状态的话,就要用到深度优先搜索,截取一个子串,然后判断是否为回文子串,如果是,加入path表中,然后深度继续寻找。
- 常规解法,一定要会。
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.length();i++){
if(isPalindrome(s,start,i)){
out.push_back(s.substr(start,i-start+1));
dfs(s,i+1,out,res);
out.pop_back();
}
}
}
bool isPalindrome(string s,int start,int end){
while(start<end){
if(s[start]!=s[end]){
return false;
}
start++;
end--;
}
return true;
}
};
Python
思路还是递归,但在递归的时候要加一个判断当前的字符串是否是回文子串的,这样才能继续递归下去。
class Solution:
def solve(self, s, start, ans, res):
if start==len(s):
res.append([item for item in ans])
for j in range(start,len(s)):
if self.check(s,start,j):
ans.append(s[start:j+1])
self.solve(s, j+1, ans, res)
ans.pop(-1)
def check(self,s,i,j):
while(i<=j):
if s[i]==s[j]:
j-=1
i+=1
else:
return False
return True
def partition(self, s: str) -> List[List[str]]:
res = []
self.solve(s,0,[],res)
return res
参考文献
[编程题]palindrome-partitioning
[LeetCode] Palindrome Partitioning 拆分回文串