力扣算法ing(59 / 100)
4.17 回溯合集—131.分割回文数
给你一个字符串 s
,请你将 s
分割成一些 子串,使每个子串都是 回文串 。返回 s
所有可能的分割方案。
示例 1:
输入:s = "aab"
输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a"
输出:[["a"]]
提示:
1 <= s.length <= 16
s
仅由小写英文字母组成
我的思路:
分割为子串,每个子串都是回文串
aab
a a b
aa b
a ab
每个都是回文串->单个值肯定是回文串
如果进行回溯的话:
a aa aab
a ab(×)b
b
a,a,b aa,b
回溯:
for循环遍历字符串
回溯遍历剩下的字符串,判断是否为回文,不能重复切割
遍历终止条件startIndex === s,length;
判断是否为回文:双指针判断是否相同
function isHuiwen(s:string , startIndex:number , i : number){while(startIndex < i){if(s[startIndex] !== s[i]){return false;}startIndex++;i--;}return true;}
答案错误:在 backtracking
函数中,将字符逐个添加到路径中,这是错误的,我们应该添加的是子串
path.push(s.substring(startIndex , i+1));
正确代码:
function partition(s: string): string[][] {const path = [];const res = [];function backtracking(startIndex : number){if(startIndex === s.length){res.push([...path]);return;}for(let i = startIndex ; i< s.length ;i++){// 判断是否为回文// 是回文if(isHuiwen(s , startIndex , i)){path.push(s.substring(startIndex , i+1));}else {continue;}backtracking(i+1);path.pop();}}function isHuiwen(s:string , startIndex:number , i : number){while(startIndex < i){if(s[startIndex] !== s[i]){return false;}startIndex++;i--;}return true;}backtracking(0);return res;
};
总结:最开始的时候我确实有点不知所措,但是其实这里面就是两个算法:回溯+判断回文
回溯的思路和组合数大差不差,但是在进入path之前要判断是否为回文字符,放入应该是子串而不是字符