學渣帶你刷Leetcode0131分割回文串

題目描述

給定一個字符串 s,將 s 分割成一些子串,使每個子串都是迴文串。

返回 s 所有可能的分割方案。

示例:

輸入: "aab"
輸出:
[
  ["aa","b"],
  ["a","a","b"]
]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/palindrome-partitioning
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

白話題目:
 

算法:

 

詳細解釋關注 B站  【C語言全代碼】學渣帶你刷Leetcode 不走丟 https://www.bilibili.com/video/BV1C7411y7gB

C語言完全代碼

int isHui(char *s, int start, int end)
{
    while (start <= end) {
        if (s[start] != s[end]) {
            return 0;
        }
        start++;
        end--;
    }
    return 1;
}

void dfs(char *s, int pos, char ***res, int *returnSize, int *result, int idx, int *returnColSizes)
{
    if (s[pos] == '\0') { //匹配到s的結尾了
        res[*returnSize] = (char **)malloc((idx - 1) * sizeof(char *));
        for (int i = 1; i < idx; i++) {
            res[*returnSize][i - 1] = (char *)malloc(sizeof(char) * (result[i] - result[i - 1] + 1)); //加1是因爲\0
            int k = 0;
            for(int j = result[i - 1] + 1; j <= result[i]; j++) {
                res[*returnSize][i - 1][k++] = s[j];
            }
            res[*returnSize][i - 1][k] = '\0';
        }
        returnColSizes[*returnSize] = idx - 1;
        (*returnSize)++;
    }
    
    for(int i = pos; s[i] != '\0'; i++){
        if(isHui(s, pos, i)){
            result[idx] = i;
            dfs(s, i + 1, res, returnSize, result, idx + 1, returnColSizes);
        }
    }
}

#define MAX_SIZE 1024
char *** partition(char * s, int* returnSize, int** returnColumnSizes){
    int len = strlen(s);
    char ***res = (char ***)malloc(MAX_SIZE * sizeof(char **));
    *returnColumnSizes = (int *)malloc(MAX_SIZE *sizeof(int));
    
    int *result = (int *)malloc((len + 1) * sizeof(int));
    result[0] = -1;
    
    *returnSize = 0;
    dfs(s, 0, res, returnSize, result, 1, *returnColumnSizes);
    return res;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章