93复原ip地址
class Solution {
public:
vector<string>res;
vector<string>path;
vector<string> restoreIpAddresses(string s)
{
if(s.size()<4)return res;
dg(s,0);
return res;
}
void dg(string s, int index)
{
if(path.size()==4&&index==s.size())
{
string t=path[0]+'.'+path[1]+'.'+path[2]+'.'+path[3];
res.push_back(t);
return;
}
else if(path.size()==4&&index<s.size())return;
for(int length=1;length<=3;length++)
{
if(index+length>s.size()||index+length<=s.size()&& path.size() == 4) return;
if(length!=1&&s[index]=='0') return;
string st=s.substr(index,length);
if(stoi(st)>255)return;
path.push_back(st);
dg(s,index+length);
path.pop_back();
}
}
};
第二种思路
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
// IP地址结果集
vector<string> ret;
// 单个IP地址
string ans;
// 我用了四重循环,你骂我吧
for (int a=1; a<=3; a++)
for (int b=1; b<=3; b++)
for (int c=1; c<=3; c++)
for (int d=1; d<=3; d++)
// A、B、C、D 四段所占字符总数 一定是需要等于len(s)的
if (a+b+c+d == s.length()) {
// 转换成数字,我们接下来需要用来判断
int A = stoi(s.substr(0, a));
int B = stoi(s.substr(a, b));
int C = stoi(s.substr(a+b, c));
int D = stoi(s.substr(a+b+c, d));
// 都 <= 255就可以了
if (A<=255 && B<=255 && C<=255 && D<=255) {
ans = to_string(A) + "." + to_string(B) + "." + to_string(C) + "." + to_string(D);
// 这里应该知道吧,一个IP地址长度 = 原s长度 + 3(3个点字符)
if (ans.length() == s.length()+3)
// 这里为什么要判断呢:
// 比如s=101023, 拆分成1,0,1,023
// 023会被我们 字符串 转数字抹去0,已经缺少 s中的字符了,所以我们这里需要额外判断
ret.push_back(ans);
}
}
return ret;
}
};