题目
给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
链接
解析
建立二维判定数组,进行暴搜求解
代码
class Solution {
public:
vector<vector<bool>> f; // 如果子串s[i..j]为回文串, 那么f[i][j]=true
vector<vector<string>> ans; // 记录所有方案
vector<string> path; // 当前搜索的路径
vector<vector<string>> partition(string s) {
int n = s.size();
f = vector<vector<bool>>(n, vector<bool>(n));
// 初始化判定数组
for(int j=0; j<n; ++j)
for(int i=0; i<=j; ++i)
if(i==j) f[i][j]=true; // 如果是仅有1个字符的情况, 则必然为true
else if(s[i]==s[j]){
if(i+1>j-1 || f[i+1][j-1]) f[i][j]=true;
}
dfs(s, 0);
return ans;
}
void dfs(string &s, int k){
if(k==s.size()) ans.push_back(path);
else{
for(int i=k; i<s.size(); ++i)
if(f[k][i]){
// 如果找到子串为回文串
path.push_back(s.substr(k, i-k+1));
dfs(s, i+1);
path.pop_back();
}
}
}
};
class Solution:
ans = []
path = []
def partition(self, s: str) -> List[List[str]]:
n = len(s)
self.ans=[] # 清空类变量
self.path=[]
self.f = [[False for _ in range(n)] for _ in range(n)]
for j in range(n):
for i in range(j+1):
if i==j: self.f[i][j]=True
elif s[i]==s[j]:
if i+1>j-1 or self.f[i+1][j-1]:
self.f[i][j]=True
self.dfs(s, 0)
return self.ans
def dfs(self, s, k):
if k==len(s):
self.ans.append(list(self.path))
else:
for i in range(k, len(s)):
if self.f[k][i] is True:
self.path.append(str(s[k:i+1]))
self.dfs(s, i+1)
self.path.pop()