题目
文本
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。
返回 s 所有可能的分割方案。
示例:
输入: “aab”
输出:
[
[“aa”,“b”],
[“a”,“a”,“b”]
]
来源:力扣(LeetCode)
模板
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
* 返回大小为* returnSize的数组。
*数组的大小作为* returnColumnSizes数组返回。
* 注意:返回的数组和* columnSizes数组都必须被分配,假设调用者调用了free()。
*/
char *** partition(char * s, int* returnSize, int** returnColumnSizes){
}
解题
分析思路
我们可以得知需要分析所有的可能分割的方法。使用C语言解题显得十分麻烦。
完整源码
void dfs(char* s, int n, int i, int** f, char*** ret, int* retSize, int* retColSize, char** ans, int* ansSize) {
if (i == n) {
char** tmp = malloc(sizeof(char*) * (*ansSize));//对于元素数组采取初始化操作(malloc)
for (int j = 0; j < (*ansSize); j++) {
int ansColSize = strlen(ans[j]);
tmp[j] = malloc(sizeof(char) * (ansColSize + 1));
strcpy(tmp[j], ans[j]);
}
ret[*retSize] = tmp;
retColSize[(*retSize)++] = *ansSize;
return;
}
for (int j = i; j < n; ++j) {
if (f[i][j]) {
char* sub = malloc(sizeof(char) * (j - i + 2));
for (int k = i; k <= j; k++) {
sub[k - i] = s[k];
}
sub[j - i + 1] = '\0';
ans[(*ansSize)++] = sub;
dfs(s, n, j + 1, f, ret, retSize, retColSize, ans, ansSize);
--(*ansSize);
}
}
}
char*** partition(char* s, int* returnSize, int** returnColumnSizes) {
int n = strlen(s);//测量s的长度
int retMaxLen = n * (1 << n);//进行左移计算的操作
char*** ret = malloc(sizeof(char**) * retMaxLen);//采取malloc的初始化
*returnSize = 0;//初始化为0填充
*returnColumnSizes = malloc(sizeof(int) * retMaxLen);//同样的malloc的初始化内存空间
int* f[n];//建立数组f(n长度)
for (int i = 0; i < n; i++) {
f[i] = malloc(sizeof(int) * n);//进行内存分配
for (int j = 0; j < n; j++) {
f[i][j] = 1;//所有元素进行1填充
}
}
for (int i = n - 1; i >= 0; --i) {
for (int j = i + 1; j < n; ++j) {
f[i][j] = (s[i] == s[j]) && f[i + 1][j - 1];
}
}
char* ans[n];//建立ans数组
int ansSize = 0;//初始化ansSize
dfs(s, n, 0, f, ret, returnSize, *returnColumnSizes, ans, &ansSize);//执行dfs函数操作
return ret;
}