代碼隨想錄打卡第28天 93. 復原 IP 地址 78. 子集 90. 子集 II

93. 復原 IP 地址

題目鏈接:https://leetcode.cn/problems/restore-ip-addresses/

算法思想:回溯算法。

重要的是如何切割??梢允褂靡粋€變量point_num記錄下切割的次數(shù),作為終止條件。

class Solution {

public:

? ? vector<vector<string>> final;

? ? vector<string> path;

? ? bool hefa(string sub)

? ? {

? ? ? ? if(sub.size()>1&&sub[0] == '0')

? ? ? ? ? ? return false;

? ? ? ? if(sub == "")

? ? ? ? ? ? return false;

? ? ? ? int sub_i = atoi(sub.c_str());

? ? ? ? if(sub_i <=255&&sub_i>=0)

? ? ? ? ? ? return true;

? ? ? ? return false;

? ? }

? ? void huisu(string &s, int start,int point_num)

? ? {

? ? ? ? if(point_num == 3)

? ? ? ? {

? ? ? ? ? ? string sub = s.substr(start, s.size()-start);

? ? ? ? ? ? // cout<<"sub:"<<sub<<endl;

? ? ? ? ? ? if(hefa(sub))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? path.push_back(s);

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? for(int i = start; i< s.size();i++)

? ? ? ? {

? ? ? ? ? ? string sub = s.substr(start, i-start+1);

? ? ? ? ? ? if(!hefa(sub))

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? point_num++;

? ? ? ? ? ? s.insert(s.begin()+i+1, '.');

? ? ? ? ? ? // path.push_back(sub);

? ? ? ? ? ? huisu(s, i+2, point_num);

? ? ? ? ? ? point_num--;

? ? ? ? ? ? s.erase(s.begin()+i+1);

? ? ? ? }

? ? }

? ? vector<string> restoreIpAddresses(string s) {

? ? ? ? huisu(s, 0, 0);

? ? ? ? vector<string> res;

? ? ? ? return path;

? ? }

};

78. 子集

https://leetcode.cn/problems/subsets/

算法思想: 回溯。

要注意收集結(jié)果的位置是每次進入for循環(huán)之前收集。

class Solution {

public:

? ? vector<vector<int>> res;

? ? vector<int> path;

? ? void huisu(vector<int>& nums, int start)

? ? {

? ? ? ? res.push_back(path);

? ? ? ? if(start == nums.size())

? ? ? ? {?

? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? // cout<<"start:"<<start<<endl;

? ? ? ? for(int i=start; i<nums.size();i++)

? ? ? ? {

? ? ? ? ? ? path.push_back(nums[i]);

? ? ? ? ? ? huisu(nums, i+1);

? ? ? ? ? ? path.pop_back();


? ? ? ? }

? ? }

? ? vector<vector<int>> subsets(vector<int>& nums) {

? ? ? ? huisu(nums,0);

? ? ? ? return res;

? ? }

};

90. 子集 II

題目鏈接:https://leetcode.cn/problems/subsets-ii/

算法思想:

回溯。

不包含重復元素,則需排序。

class Solution {

public:

? ? vector<vector<int>> output;

? ? vector<int> res;

? ? void huisu(vector<int>& nums, int start)

? ? {

? ? ? ? output.push_back(res);

? ? ? ? if(start==nums.size())

? ? ? ? ? ? return;

? ? ? ? for(int i=start;i<nums.size();i++)

? ? ? ? {

? ? ? ? ? ? if(i!=start&&nums[i]==nums[i-1])

? ? ? ? ? ? ? ? continue;

? ? ? ? ? ? res.push_back(nums[i]);

? ? ? ? ? ? huisu(nums, i+1);

? ? ? ? ? ? res.pop_back();

? ? ? ? }

? ? }

? ? vector<vector<int>> subsetsWithDup(vector<int>& nums) {

? ? ? ? sort(nums.begin(), nums.end());

? ? ? ? huisu(nums, 0);

? ? ? ? return output;

? ? }

};

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容