93. 复原IP地址 Restore IP Addresses

题目 <https://leetcode-cn.com/problems/restore-ip-addresses/>

回溯法

int isValid(char *s,int s_len){
    if(s_len == 0){
        return 0;
    }

    if(s_len == 1 && s[0] == '0'){
        return 1;
    }

    if(s[0] == '0'){
        return 0;
    }

    int i,n=0;
    for(i=0;i<s_len;i++){
        n*=10;
        n += (s[i]-'0');
    }

    if(n>255){
        return 0;
    }

    return 1;

}

char **returnString;
int returnColSizes;
int returnLen;

void search(char *s,int s_len,char*tmp,int tmp_len,int index,int point){
    if(index == s_len && point == 4){
        returnString[returnLen] = malloc(sizeof(char) * (returnColSizes+1));
        memcpy(returnString[returnLen],tmp,returnColSizes);
        returnString[returnLen][returnColSizes] = '\0';
        returnLen++;
        return;
    }

    int i,len;
    for(i=index;i<s_len;i++){
        len = i-index+1;
        if(isValid(&s[index],len) == 1){
            memcpy(&tmp[tmp_len],&s[index],len);
            tmp[tmp_len + len] = '.';
            search(s,s_len,tmp,tmp_len + len + 1,i+1,point+1);
        }else{
            break;
        }
    }
}

char ** restoreIpAddresses(char * s, int* returnSize){
    int s_len = strlen(s);
    if(s_len > 12){
        *returnSize = 0;
        return NULL;
    }

    returnString = malloc(sizeof(char*) * 10000);
    returnColSizes = s_len+3;
    returnLen = 0;

    char *tmp = malloc(sizeof(char) * (s_len*2+1));
    search(s,s_len,tmp,0,0,0);

    free(tmp);
    *returnSize = returnLen;
    return returnString;
}

猜你喜欢

转载自blog.csdn.net/ZRXSLYG/article/details/112133142