当前位置: 首页 > news >正文

香港疫情最新通报seo在线优化排名

香港疫情最新通报,seo在线优化排名,建筑设计和室内设计的区别,钟祥网站制作131. 分割回文串 - 力扣(LeetCode) 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串 示例 1: 输入:s "aa…

131. 分割回文串 - 力扣(LeetCode)

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串

示例 1:

输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]

示例 2:

输入:s = "a"
输出:[["a"]]

>>思路和分析:

  1. 切割问题,有不同的切割方式
  2. 判断回文

代码随想录的Carl老师说:“切割问题类似组合问题”!(这段文字来自代码随想录--分割回文串)

对于字符串abcdef

  • 组合问题选取一个a之后,在bcdef中再去选取第二个,选取b之后在cdef中再选取第三个.....
  • 切割问题切割一个a之后,在bcdef中再去切割第二段,切割b之后在cdef中再切割第三段.....

>>回溯三部曲:

1).确定回溯函数参数

  • path 存放切割后回文的子串
  • result 保存 path,作为结果集
  • startIndex 来控制for循环的起始位置(表示下一轮递归遍历的起始位置),还用来表示这条切割线.(切割过的地方,不能重复切割,和组合问题也是保持一致的【这句话来自代码随想录】)
vector<vector<string>> result;
vector<string> path; // 放已经回文的子串
void backtracking (const string& s, int startIndex) // startIndex 就用来表示这条切割线

2).递归的终止条件

如果切割线切到了字符串最后面,表示找了一种切割方法,此时终止本层递归!也就是出现这种情况: startIndex >= s.size(),收集结果后直接return;

void backtracking (const string& s, int startIndex) {// 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了if (startIndex >= s.size()) {result.push_back(path);return;}
}

3).单层搜索的逻辑

>>问题(O_O)?思考:在递归循环中如何截取子串呢?

  • [startIndex,i]:左闭右闭,表示子串的起始位置和终止位置,有截取区间就可以截取子串。substr(startIndex, i - startIndex + 1);

>>问题(O_O)?思考:如何判断所截取子串是否为回文子串呢?

  1. 判断是否为回文子串:isPalindrome(s, startIndex, i),用双指针法
  2. 如果是回文,就加入在vector<string> path中,path 用来记录切割过的回文子串
for (int i = startIndex; i < s.size(); i++) {if (isPalindrome(s, startIndex, i)) { // 是回文子串// 获取[startIndex,i]在s中的子串string str = s.substr(startIndex, i - startIndex + 1);path.push_back(str);} else {                // 如果不是则直接跳过continue;}backtracking(s, i + 1); // 寻找i+1为起始位置的子串path.pop_back();        // 回溯过程,弹出本次已经添加的子串
}

注意:切割过的位置,不能重复切割,应传入下一层的起始位置为 i + 1,即

  • backtracking(s, i + 1);

 (1)判断是否为回文子串

bool isPalindrome(const string& s, int start, int end) {for (int i = start, j = end; i < j; i++, j--) {if (s[i] != s[j]) {return false;}}return true;}
bool isPalindrome(string s) {int left = 0,right = s.size()-1;while(left<=right) {if (s[left] != s[right]) return false;left++;right--;}return true;
}

 (2)C++代码

class Solution {
private:vector<vector<string>> result;vector<string> path; // 放已经回文的子串void backtracking (const string& s, int startIndex) {// 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了if (startIndex >= s.size()) {result.push_back(path);return;}for (int i = startIndex; i < s.size(); i++) {if (isPalindrome(s, startIndex, i)) {   // 是回文子串// 获取[startIndex,i]在s中的子串string str = s.substr(startIndex, i - startIndex + 1);path.push_back(str);} else {                                // 不是回文,跳过continue;}backtracking(s, i + 1); // 寻找i+1为起始位置的子串path.pop_back(); // 回溯过程,弹出本次已经添加的子串}}bool isPalindrome(const string& s, int start, int end) {for (int i = start, j = end; i < j; i++, j--) {if (s[i] != s[j]) {return false;}}return true;}
public:vector<vector<string>> partition(string s) {backtracking(s, 0);return result;}
};
  • 时间复杂度: O(n * 2^n)
  • 空间复杂度: O(n^2)
class Solution {
public:vector<vector<string>> result;vector<string> path; // 放已经回文的子串bool isPalindrome(string s) {int left = 0,right = s.size()-1;while(left<=right) {if (s[left] != s[right]) return false;left++;right--;}return true;}void backtracking(string s,int startIndex) {// 如果起始位置已经大于s的大小,说明已经找到了一组分割方案了if(startIndex >= s.size()) {result.push_back(path);return;}for(int i=startIndex;i<s.size();i++) {// 获取[startIndex,i]在s中的子串string subStr = s.substr(startIndex,i-startIndex+1);if(isPalindrome(subStr)) path.push_back(subStr);// 是回文子串else continue;// 不是回文,跳过backtracking(s, i + 1); // 寻找i+1为起始位置的子串path.pop_back(); // 回溯过程,弹出本次已经添加的子串}}vector<vector<string>> partition(string s) {backtracking(s, 0);return result;}
};

 参考和推荐文章、视频:
带你学透回溯算法-分割回文串(对应力扣题目:131.分割回文串)| 回溯法精讲!_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1c54y1e7k6/?p=67&spm_id_from=pageDriver代码随想录 (programmercarl.com)icon-default.png?t=N7T8https://www.programmercarl.com/0131.%E5%88%86%E5%89%B2%E5%9B%9E%E6%96%87%E4%B8%B2.html#%E4%BC%98%E5%8C%96

http://www.zhongyajixie.com/news/19917.html

相关文章:

  • 什么网站需要数据库最近新闻事件
  • 做企业网站的信阳网络推广公司
  • 江阴市建设局网站百度收录接口
  • 找做课件的网站市场推广
  • wordpress去除幻灯片什么是优化
  • 用php做网站出现的问题百度上海推广优化公司
  • 移动网站模板网络销售真恶心
  • 网迎客 网站建设博客营销
  • 本地服务器网站建设百度云盘官网
  • 德州做网站建设的公司哪家好东莞网站设计排行榜
  • 积分动力wordpress插件重庆seo网站建设
  • 中山市建设局网站窗口电话号码谷歌seo优化技巧
  • 济南网站建设山东酷风怎么在百度上发布信息
  • vm虚拟机搭建wordpress最新黑帽seo教程
  • 网站建设规划书电商北京网络推广外包公司排行
  • 网站详情页艺术字怎么做的苏州网站优化排名推广
  • vue is做的购物网站什么是软文文案
  • 手机网站优化怎么做手机广告推广软件
  • 中铁十六局门户网seo免费诊断
  • 毕业论文的网站做网络推广软件有哪些
  • 做食品外贸选哪个网站好淘宝seo关键词的获取方法有哪些
  • 企业网站如何做排名百度开放平台登录
  • 做网站的公司地址网站百度权重查询
  • 投资公司怎么赚钱seo营销外包公司
  • 定制网站开发报价信息流优化师职业规划
  • 建站之星网站模板电工培训内容
  • 做公司网站软件海外推广营销 平台
  • 廊坊网站建设招聘如何写软文赚钱
  • 什么网站做海宁的房产好网络优化这个行业怎么样
  • 二手设备回收做哪个网站好怎么请专业拓客团队