现在有一个只包含数字的字符串,将该字符串转化成IP地址的形式,返回所有可能的情况。
例如:
给出的字符串为"25525522135",
返回["255.255.22.135", "255.255.221.35"]. (顺序没有关系)
数据范围:字符串长度
要求:空间复杂度
,时间复杂度
注意:ip地址是由四段数字组成的数字序列,格式如 "x.x.x.x",其中 x 的范围应当是 [0,255]。
"25525522135"
["255.255.22.135","255.255.221.35"]
"1111"
["1.1.1.1"]
"000256"
[]
int strsearch(char* s, char c) {
int i;
for(i=0;i<strlen(s);i++) {
if(s[i]==c)
return i;
}
return -1;
}
bool judgenum(char* s, int n) {
int i,num=0;
if(!n)
return false;
for(i=0;i<n;i++) {
if((s[i]<'0')||(s[i]>'9'))
return false;
if((i==0)&&(s[i]=='0')&&(n!=1))
return false;
num *= 10;
num += s[i]-'0';
}
if(num>255)
return false;
return true;
}
bool solve(char* IP ) {
int i;
int Point_LOC=0;
for(i=0;i<4;i++) {
int NumLength = strsearch(IP+Point_LOC,'.');
if(NumLength>0) {
if(!judgenum(IP+Point_LOC,NumLength))
return false;
Point_LOC += NumLength+1;
}
else {
if(!judgenum(IP+Point_LOC,strlen(IP)-Point_LOC))
return false;
Point_LOC += NumLength+1;
break;
}
}
return true;
}
char** restoreIpAddresses(char* s, int* returnSize ) {
int i,j,k,m=0;
char buf[12+4], **res;
if(strlen(s)<4) {
*returnSize = 0;
return NULL;
}
res = (char**)malloc(100*sizeof(char*));
for(i=0; i<strlen(s)-2; i++) {
for(j=0; j<strlen(s)-1-i; j++) {
for(k=0; k<strlen(s)-i-j; k++) {
strncpy(buf, s, i);
buf[i]='.';
strncpy(buf+i+1, s+i, j);
buf[i+1+j]='.';
strncpy(buf+i+1+j+1, s+i+j, k);
buf[i+1+j+1+k]='.';
strcpy(buf+i+1+j+1+k+1, s+i+j+k);
if(solve(buf)) {
res[m] = (char*)malloc(sizeof(buf));
strcpy(res[m++], buf);
}
}
}
}
*returnSize = m;
return res;
}