分割回文串
LeetCode 131 分割回文串 131
解题关键: 搜索+判断是否为子串是否为回文
预处理子串是否为回文串核心代码:
状态转移方程:g[i][j]=(s[i]==s[j])&&s[i+1][j-1]
i、j指针指向的字符要一致并且(i,j)的子串(i+1,j-1)为回文串
判断回文串完整代码:
for(int i=n-1;i>=0;i--)
for(int j=i+1;j<n;j++){
g[i][j]=(s[i]==s[j])&&g[i+1][j-1];
}
搜索核心代码:
void dfs(int i,const string &s){
if(i==s.size()){
ans.emplace_back(cur);
return;
}
for(int j=i;j<s.size();j++){
if(g[i][j]){ //这里可以改为记忆化搜索if(isPalindrome(s,i,j)==1)
cur.push_back(s.substr(i,j-i+1));
dfs(j+1,s)//j已经作为当前回文串的右边界,要从j+1处开始搜搜
cur.pop_back();//清除该层搜索记录
}
}
}
记忆化搜索核心代码:
//f[i][j]值为0表示还未搜索到,1表示(i,j)区间为回文串,-1表示(i,j)区间不是回文串
int isPalindrome(const string& s,int i,int j){
if(f[i][j]){
return f[i][j];
}
if(i>=j){
return f[i][j]=1;
}
return f[i][j]=(s[i]==s[j]&&isPalindrome(s,i+1,j-1));
}