分割回文串 (leetcode 131
leetcode系列
文章目录
- 一、核心操作
- 二、外层配合操作
- 三、核心模式代码
- 总结
先遍历字符串形成一个表,后续根据要判断的字符串首尾来查表即可获得结果,降低时间复杂度
一、核心操作
- 建立表函数:一个二维表,分别为字符串的开头和结尾,初始化后第一层遍历要倒过来,这样在保证在计算第i行时, i+1行已经计算好了,然后内层正常循环。当ij相等时肯定为true,因为此时就一个字母;当j=i+1时,如果s[i]和s[j]相等,也是回文串,当其他的情况时,如果s[i]和s[j]相等,就需要查之前的表,当s[i+1]和s[j-1]相等,才能将这一格赋为true
- 回溯函数:当到了最后一层,也就是startIndex为s.size(),则可以收获,而在每一层的循环中,首先判断从startIndex到i的字符串是不是回文串,不是就continue,如果是则将其存进路径,进行递归和回溯
提示:小白个人理解,如有错误敬请谅解!
二、外层配合操作
- 分别调用两个函数
三、核心模式代码
代码如下:
class Solution {
public:
vector<vector<string>> res;
vector<string> path;
vector<vector<bool>> isPalindrome;
void getPalindrome(string& s)
{
isPalindrome.resize(s.size(),vector<bool>(s.size(),false));
for(int i=s.size()-1;i>=0;i--)
{
for(int j=i;j<s.size();j++)
{
if(j==i)isPalindrome[i][j]=true;
else if(j-1==i){isPalindrome[i][j]=(s[i]==s[j]);}
else {isPalindrome[i][j]=(s[i]==s[j] && isPalindrome[i+1][j-1]);}
}
}
}
void backTracking(string& s, int startIndex)
{
if(startIndex==s.size())
{
res.push_back(path);
return;
}
for(int i=startIndex;i<s.size();i++)
{
if(!isPalindrome[startIndex][i])continue;
string ss=s.substr(startIndex,i-startIndex+1);
path.push_back(ss);
backTracking(s,i+1);
path.pop_back();
}
}
vector<vector<string>> partition(string s) {
if(!s.size())return res;
getPalindrome(s);
backTracking(s,0);
return res;
}
};
总结
- 无