日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

复原ip地址

發布時間:2024/4/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 复原ip地址 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思路


意識到這是切割問題,「切割問題就可以使用回溯搜索法把所有可能性搜出來」

回溯三部曲

遞歸參數
在回溯算法:分割回文串中我們就提到切割問題類似組合問題。

startIndex一定是需要的,因為不能重復分割,記錄下一層遞歸分割的起始位置。

本題我們還需要一個變量pointNum,記錄添加逗點的數量。

遞歸終止條件
終止條件和回溯算法:分割回文串情況就不同了,本題明確要求只會分成4段,所以不能用切割線切到最后作為終止條件,而是分割的段數作為終止條件。

pointNum表示逗點數量,pointNum為3說明字符串分成了4段了。
然后驗證一下第四段是否合法,如果合法就加入到結果集里

單層搜索的邏輯

在回溯算法:分割回文串中已經講過在循環遍歷中如何截取子串。

在for (int i = startIndex; i < s.size(); i++)循環中 [startIndex, i]這個區間就是截取的子串,需要判斷這個子串是否合法。

如果合法就在字符串后面加上符號.表示已經分割。

如果不合法就結束本層循環,如圖中剪掉的分支:

然后就是遞歸和回溯的過程:

遞歸調用時,下一層遞歸的startIndex要從i+2開始(因為需要在字符串中加入了分隔符.),同時記錄分割符的數量pointNum 要 +1。

回溯的時候,就將剛剛加入的分隔符. 刪掉就可以了,pointNum也要-1。

判斷子串是否合法

考慮以下三點:
1、段位以0為開頭的數字不合法
2、段位里有非正整數字符不合法
3、段位如果大于255了不合法

class Solution { private:vector<string> result;// 記錄結果// startIndex: 搜索的起始位置,pointNum:添加逗點的數量void backtracking(string& s, int startIndex, int pointNum) {if (pointNum == 3) { // 逗點數量為3時,分隔結束// 判斷第四段子字符串是否合法,如果合法就放進result中if (isValid(s, startIndex, s.size() - 1)) {result.push_back(s);}return;}for (int i = startIndex; i < s.size(); i++) {if (isValid(s, startIndex, i)) { // 判斷 [startIndex,i] 這個區間的子串是否合法s.insert(s.begin() + i + 1 , '.'); // 在i的后面插入一個逗點pointNum++;backtracking(s, i + 2, pointNum); // 插入逗點之后下一個子串的起始位置為i+2pointNum--; // 回溯s.erase(s.begin() + i + 1); // 回溯刪掉逗點} else break; // 不合法,直接結束本層循環}}// 判斷字符串s在左閉又閉區間[start, end]所組成的數字是否合法bool isValid(const string& s, int start, int end) {if (start > end) {return false;}if (s[start] == '0' && start != end) { // 0開頭的數字不合法return false;}int num = 0;for (int i = start; i <= end; i++) {if (s[i] > '9' || s[i] < '0') { // 遇到非數字字符不合法return false;}//計算字符串組成的數字大小,如"255"組成的數字大小num = num * 10 + (s[i] - '0');if (num > 255) { // 如果大于255了不合法return false;}}return true;} public:vector<string> restoreIpAddresses(string s) {result.clear();backtracking(s, 0, 0);return result;} };

總結

以上是生活随笔為你收集整理的复原ip地址的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。