题目描述
给定一个字符串 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;
}