随想录一刷Day26——回溯算法
admin
2024-05-06 06:36:48
0

文章目录

  • Day26_回溯算法
    • 9. 分割回文串
    • 10. 复原 IP 地址
    • 11. 子集

Day26_回溯算法

9. 分割回文串

131. 分割回文串
思路:

  1. 回溯分割,利用回溯枚举对字符串的所有分割方案
  2. 双指针法判断回文串
class Solution {
private:vector> result;vector path;void backtracking(const string& s, int startIndex) {if (startIndex >= s.size()) {result.push_back(path);return ;}int size = s.size();for (int i = startIndex; i < size; i++) {if (isPalindrome(s, startIndex, i)) {string str = s.substr(startIndex, i - startIndex + 1);path.push_back(str);} else continue;backtracking(s, 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> partition(string s) {result.clear();path.clear();backtracking(s, 0);return result;}
};

优化:

每次划分出区间重新判断回文串,出现了大量重复判断,可以利用一个数组直接将所有回文串判断出来,下次直接 O(1)O(1)O(1) 访问某区间内的字符串是否是回文串即可。

class Solution {
private:vector> result;vector path;vector> isPalindrome;void backtracking(const string& s, int startIndex) {if (startIndex >= s.size()) {result.push_back(path);return ;}int size = s.size();for (int i = startIndex; i < size; i++) {if (isPalindrome[startIndex][i]) {string str = s.substr(startIndex, i - startIndex + 1);path.push_back(str);} else continue;backtracking(s, i + 1);path.pop_back();}}void computePalindrome(const string& s) {int size = s.size();isPalindrome.resize(size, vector(size, false));for (int i = size - 1; i >= 0; i--) {for (int j = i; j < size; j++) {if (i == j) isPalindrome[i][j] = true;else if (j - i == 1 && s[i] == s[j]) isPalindrome[i][j] = true;else if (s[i] == s[j] && isPalindrome[i + 1][j - 1]) isPalindrome[i][j] = true;}}}public:vector> partition(string s) {result.clear();path.clear();computePalindrome(s);backtracking(s, 0);return result;}
};

10. 复原 IP 地址

93. 复原 IP 地址
思路:

还是枚举分割的区间,但是回溯出口是划分区间数为 4,而不是最后一次划分。

class Solution {
private:vector result;void backtracking(string& s, int startIndex, int pointNum) {if (pointNum == 3) { // 当出现三个断点,即分为 4 段if (isVaild(s, startIndex, s.length() - 1)) {result.push_back(s);}return ;}for (int i = startIndex; i < s.length(); i++) {if (isVaild(s, startIndex, i)) {s.insert(s.begin() + i + 1, '.'); // 在i的后面插入一个逗点backtracking(s, i + 2, pointNum + 1); // 插入 '.' 后,起始位置为 i + 2s.erase(s.begin() + i + 1); // 回溯删掉逗点} else break;}}bool isVaild(const string& s, int start, int end) {if (start > end) return false;if (s[start] == '0' && start != end) return false; // 前导零int num = 0;for (int i = start; i <= end; i++) {if (s[i] < '0' || s[i] > '9') return false;num = num * 10 + (s[i] - '0');if (num > 255) return false;}return true;}public:vector restoreIpAddresses(string s) {result.clear();if (s.length() < 4 || s.length() > 12) return result;backtracking(s, 0, 0);return result;}
};

11. 子集

78. 子集
思路:

如果把 子集问题、组合问题、分割问题都抽象为一棵树的话,那么组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点!
其实子集也是一种组合问题,因为它的集合是无序的,子集{1,2} 和 子集{2,1}是一样的。

直接利用回溯找组合的模板,区别就是

  1. 找子集的过程是组合问题,没有重复的
  2. 不需要结束条件,因为此过程需要枚举所有的可能,即递归所有情况后递归自动结束
class Solution {
private:vector> result;vector path;void backtracking(vector& nums, int startIndex) {result.push_back(path);for (int i = startIndex; i < nums.size(); i++) {path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();}}public:vector> subsets(vector& nums) {result.clear();path.clear();backtracking(nums, 0);return result;}
};

相关内容

热门资讯

网红养生法靠谱吗?有人因晒背2... 网红养生法靠谱吗?有人因晒背2小时送医 安徽省淮北市,市民在公园里扎堆“晒背”。图据新华社客户端...
原创 四... #四川乡下喂猪的菜,竟然身价爆红,成了有钱人餐桌上的新宠 在四川的乡间田野,有一种曾经默默充当猪食...
原创 四... #四川的特色小吃“天鹅蛋”,听名字就感觉很好吃,教你具体做法 在四川的美食版图中,有一种特色小吃名...
原创 四... #四种最“难剥”的水果,懒人都不爱吃,肯为你剥第一个的绝对是真爱 作为一名热爱生活、善于观察的作家...
原创 四... #四种快手挤饺的包法,简单易学 在美食的世界里,饺子一直是备受喜爱的传统美食。而挤饺作为一种独特的...
我不想失去你,却不知该如何表达... 我不想失去你,却不知该如何表达?我该怎么办?我真的不想失去你,但我无法解释,我很爱你,但我不能去爱你...
到底谁的高音最高? 到底谁的高音最高?X JAPAN的主唱TOSHIKI其他三人和 张雨生的高音 根本没法比,不是一个档...
穿越火线小说全集 穿越火线小说全集这个.....应该没有吧,这个小说是官网的诶,耐心等等看吧
明日方舟肉鸽剧情在哪看 明日方舟肉鸽剧情在哪看 在游戏大厅的终端。《明日方舟》是由鹰角网络开发的瞎哗世一款国产战略经营类...
天涯明月刀ol装备洗诸神令需要... 天涯明月刀ol装备洗诸神令需要金币吗天涯明月刀使用铸神令洗练装备是不需要金币的,只要购买到铸神令,可...
求小说名称,有主角姓名 求小说名称,有主角姓名这...真不好回答,
2020年3月19日和平精英无... 2020年3月19日和平精英无敌战神榜怎么查?现在需要多少才能上无敌战神2020年3月19日和平精英...
和小说阅读网签约,但是我的身份... 和小说阅读网签约,但是我的身份证丢了,能不能用别人的身份证代替代替是可以,但以后要换回来就必须重换笔...
什么是游戏人生 什么是游戏人生什么是游戏人生别人的时间按秒算,你的生命按天算,这就叫游戏人生。就是你所玩腾讯游戏的时...
女扮男装小说,校园的 女扮男装小说,校园的三角星秘密学院女扮男装倒没看过,校园的倒很多
三个城市的天气预报英文版,不用... 三个城市的天气预报英文版,不用太复杂,小学四年级学的单词就可以了。快点!给我看。急需。星期天下午,天...
小孩有自卑心理 小孩有自卑心理孩子今年六岁了。他老说别人不喜欢自己。这是咋么了?我该怎么办?小孩有点轻微的自卑,建议...
类似写真女友,圣诞之吻这样多线... 类似写真女友,圣诞之吻这样多线故事的动漫。另外缘之空我看过了。失忆症 《命运石之门》《寒蝉鸣泣之时...
小小蚁国小小蚁世界兑换码大全2... 小小蚁国小小蚁世界兑换码大全2023 全新礼包码整合大家好,今天为大家分享的是小小蚁国小小蚁世界兑换...
赞颂一碗鸡蛋面的说说? 赞颂一碗鸡蛋面的说说?俗话说:“民以食为天。”几乎每个地方都有自己的美味。你看:北京的烤鸭、西安的羊...