网站诊断表网站播放视频速度优化
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;}
};
总结
- 无