有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。
例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效 IP 地址。
给定一个只包含数字的字符串 s ,用以表示一个 IP 地址,返回所有可能的有效 IP 地址,这些地址可以通过在 s 中插入 '.' 来形成。你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。

思路:1、加入一个参数来记录已经加入字符串中的 .
2、写一个函数来判断截取的字符串是否为有效IP地址;
3、终止条件就是已经有3个 . 了,此时再来判断一下剩下部分是否有效,有效就可以插入result了;backtracking里startIndex的位置要为i+2,因为i+1已经插入了 .
4、string中的insert与erase;
5、stoi不能传入非数字char型,否则会报错。
- class Solution {
- private:
- vector
result; - public:
- bool isValid(const string& s,int start,int end){
- if(start>end) return false;
- if(s[start]=='0'&&end>start) return false;
- string str=s.substr(start,end-start+1);
- int val=stoi(str);
- if(val<0||val>255) return false;
- return true;
- }
- void backtracking(string& s,int startIndex,int pointNum){
- //截取类型的题目
- //终止条件
- if(pointNum==3)
- {
- if(isValid(s,startIndex,s.size()-1)) result.push_back(s);
- return;
- }
- //单层处理
- for(int i=startIndex;i
size();i++) - {
- if(isValid(s,startIndex,i))
- {
- s.insert(s.begin()+i+1,'.');
- pointNum++;
- backtracking(s,i+2,pointNum);
- pointNum--;
- s.erase(s.begin()+i+1);//回溯过程
- }
- else break;//无效地址,直接跳出循环了
- }
- }
- vector
restoreIpAddresses(string s) { - result.clear();
- if(s.size()>12||s.size()<4) return result;
- backtracking(s,0,0);
- return result;
- }
- };