131. 分割回文串【strncat、三维数组】

131. 分割回文串

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。

示例 1:
输入:s = “aab”
输出:[[“a”,“a”,“b”],[“aa”,“b”]]

示例 2:
输入:s = “a”
输出:[[“a”]]


回溯的模型很重要!

在这里插入图片描述

从起点开始,开始向右延展,然后再回溯。
每一列都是一个for循环,对每个for循环而言,都在延展回溯!
回溯:就是在for循环里面调用自己。一直向右延展,然后再回溯。(有点像DFS)

在这里插入图片描述


C代码:

char*** ans;
int ansTop;
char** path;
int pathTop;
int* colSize;

bool compare(char *s, int i, int j) {
    while (i < j) {
        if (s[i++] != s[j--]) {
            return false;
        }
    }
    return true;
}

void addStrToPath(char* s, int i, int len) {
    char* str = (char*)malloc(sizeof(char) * (len + 1));
    str[0] = '\0';
    strncat(str, s + i, len);
    path[pathTop++] = str;
}

void addPathToAns() {
    char** pathTmp = (char**)malloc(sizeof(char*) * pathTop);
    for(int i = 0; i < pathTop; ++i) {
        pathTmp[i] = path[i];
    }
    ans[ansTop] = pathTmp;
    colSize[ansTop++] = pathTop;
}

void backTracking(char* s, int idx) {
    if (idx == strlen(s)) {
        addPathToAns();
        return;
    }
    for (int i = idx; i < strlen(s); ++i) {
        if (compare(s, idx, i)) {  // 判定条件:为回文串再往后延展,直至到末尾结束;
            addStrToPath(s, idx, i - idx + 1);
            backTracking(s, i + 1);
            --pathTop;
        }
    }
}

char *** partition(char * s, int* returnSize, int** returnColumnSizes){
    ans = (char***)malloc(sizeof(char**) * 100000);
    path = (char**)malloc(sizeof(char*) * 17);
    colSize = (int*)malloc(sizeof(int) * 100000);
    ansTop = 0;
    pathTop = 0;

    backTracking(s, 0);
    
    *returnSize = ansTop;
    *returnColumnSizes = (int*) malloc(sizeof(int) * ansTop);  // *returnColumnSizes只是一个地址,需要创建内存
    for (int i = 0; i < ansTop; ++i) {
        (*returnColumnSizes)[i] = colSize[i];
    }
    return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值