93. Restore IP Addresses
problem description
Given a string containing only digits, restore it by returning all possible valid IP address combinations.
Example:
Input: "25525511135"
Output: ["255.255.11.135", "255.255.111.35"]
algorithm thought
其实是一道典型的回溯法问题。首先第一个位置放一个字符,然后进如下一个函数,运行完回溯之后,放两个字符。然后是3个。中间判断非法情况,如果长度大于1并且第一个字符是'0',显然不行。如果转化为数字之后,数值大于255,显然也是不行的。如果所有情况都满足,最后将结果push到res中。
上面介绍的是回溯的情况,其实可以不需要回溯。因为肯定有4个地方需要我们放置数字,我们只需要3个循环,每个循环处理1-3个字符的情况。
code
class Solution {
public:
vector<string> restoreIpAddresses(string s) {
vector<string> res;
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){
if(a+b+c+d!=s.size())
continue;
string s1=s.substr(0,a);
string s2=s.substr(a,b);
string s3=s.substr(a+b,c);
string s4=s.substr(a+b+c,d);
if((s1[0]=='0'&&s1.size()!=1)||(s2[0]=='0'&&s2.size()!=1)||(s3[0]=='0'&&s3.size()!=1)||(s4[0]=='0'&&s4.size()!=1))
continue;
//cout<<s1<<' '<<s2<<' '<<s3<<' '<<s4<<'-';
//cout<<atoi(s1.c_str())<<(atoi(s1.c_str())<=255)<<' ';
if((atoi(s1.c_str())<=255)&&(atoi(s2.c_str())<=255)&&(atoi(s3.c_str())<=255)&&(atoi(s4.c_str())<=255))
res.push_back(s1+'.'+s2+'.'+s3+'.'+s4);
}
}
}
}
return res;
}
};
algorithm analysis
虽然有4个循环,但是时间复杂度不会很大,因为每个循环就进行3次,循环中的操作时间复杂度可以近似看做O(1)。
Last updated