有效 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<string> 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<s.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<string> restoreIpAddresses(string s) {
result.clear();
if(s.size()>12||s.size()<4) return result;
backtracking(s,0,0);
return result;
}
};