给你一个字符串 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;
}