参考代码随想录代码
int isValue(char* s,int left,int right){
if(left>right)
return 0;
if(s[left]=='0'&&left!=right)
return 0;
int sum=0;
for(int i=left;i<=right;i++){
if(s[i]<'0'||s[i]>'9')
return false;
sum=sum*10+s[i]-'0';
if(sum>255)
return 0;
}
return 1;
}
void dfs(char*s,char*** result,int* returnSize,int startindex,int point_num,int* point_index){
//result用于收获结果,用于这里采用realloc动态分配,所以需要传入result的地址
//startindex是当次递归开始的s数组下标,point_index数组记录'.'的下标,point_num是其下标
if(point_num==3){//已经加了三个点,判断第四个部分是否合法,合法就收割结果
if(isValue(s,startindex,strlen(s)-1)==1){
//判断最后一部分是否合法,即以这部分的开始位置到数组长度减一作为下标的范围内是否合法
char* temp=malloc(sizeof(char)*strlen(s)+4);
int count=0;
int point=0;
int j;
for(j=0;j<strlen(s);j++){
temp[count++]=s[j];
if(point<3&&j==point_index[point]){//每到'.'号存在的下标,加入'.'号
temp[count++]='.';
point++;
}
}
temp[count]='\0';
*result=(char**)realloc(*result,sizeof(char*)*((*returnSize)+1));
(*result)[(*returnSize)++]=temp;
}
return;
}
for(int i=startindex;i<strlen(s);i++){
if(isValue(s,startindex,i)==1){
point_index[point_num]=i;
dfs(s,result,returnSize,i+1,point_num+1,point_index);
}
else
break;
//如果某个从startindex到i内的字符不合法,那么从startindex到i+1、i+2....都不合法,因此直接退出循环
}
}
char ** restoreIpAddresses(char * s, int* returnSize){
char** result=(char**)malloc(0);
int* point_index=malloc(sizeof(int)*4);
(*returnSize)=0;
dfs(s,&result,returnSize,0,0,point_index);
return result;
}