c++容器set
阿新 • • 發佈:2022-05-23
93. 復原 IP 地址
有效 IP 地址 正好由四個整數(每個整數位於 0
到 255
之間組成,且不能含有前導 0
),整數之間用 '.'
分隔。
- 例如:
"0.1.2.201"
和"192.168.1.1"
是 有效 IP 地址,但是"0.011.255.245"
、"192.168.1.312"
和"[email protected]"
是 無效 IP 地址。
給定一個只包含數字的字串 s
,用以表示一個 IP 地址,返回所有可能的有效 IP 地址,這些地址可以通過在 s
中插入 '.'
來形成。你 不能 重新排序或刪除 s
中的任何數字。你可以按 任何 順序返回答案。
示例 1:
輸入:s = "25525511135" 輸出:["255.255.11.135","255.255.111.35"]
示例 2:
輸入:s = "0000"
輸出:["0.0.0.0"]
示例 3:
輸入:s = "101023"
輸出:["1.0.10.23","1.0.102.3","10.1.0.23","10.10.2.3","101.0.2.3"]
提示:
1 <= s.length <= 20
-
s
僅由數字組成
思路:
回溯問題,一個IP地址只能分為4段,對每一段進行搜尋即可。
注意:這裡使用固定大小為4的陣列來存放IP,這樣不必去做撤銷選擇的動作。直接覆蓋即可。
class Solution { public: vector<string>ans; vector<int>res;//存放IP地址 vector<string> restoreIpAddresses(string s) { int n=s.size(); res.resize(4,0); backtrack(s,0,0); return ans; } void backtrack(string s,int index,int q){ if(q==4){ if(index==s.size()){//如果四個段都分配完畢 且字串也遍歷完 string temp=""; for(int i=0;i<4;i++){ if(i!=3) temp+=to_string(res[i])+'.'; else temp+=to_string(res[i]); } ans.push_back(temp); } return;//如果四個段分配完,字串沒遍歷完 } if(index==s.size())return;//四個地址段沒分配完,字串已經遍歷完 if(s[index]=='0'){//由於不能有前導0 也就說明如果當前位置為0那麼該段只能為0 res[q]=0; backtrack(s,index+1,q+1); } //如果不為0,那麼就每種情況都考慮即可 int cnt=0; for(int i=index;i<s.size();i++){ cnt=cnt*10+(s[i]-'0'); if(cnt>0&&cnt<=255){ res[q]=cnt; backtrack(s,i+1,q+1); } else break; } } };