给你一个字符串 s
,请你将 s
分割成一些子串,使每个子串都是 回文串 。返回 s
所有可能的分割方案。
回文串 是正着读和反着读都一样的字符串。
示例 1:
输入:s = "aab" 输出:[["a","a","b"],["aa","b"]]
示例 2:
输入:s = "a" 输出:[["a"]]
提示:
1 <= s.length <= 16
s
仅由小写英文字母组成
题解:
回溯法:
func partition(s string) [][]string {
var path []string
var result [][]string
var isPalindrome func(s string, startIndex, i int) bool
// 双指针算法判断字符串是否是回文子串
// startIndex 和 i 分别代表起始位置和结束位置
isPalindrome = func(s string, startIndex, i int) bool {
left := startIndex
right := i
for left < right {
if s[left] != s[right] {
return false
}
left++
right--
}
return true
}
var backtracking func(s string, startIndex int)
backtracking = func(s string, startIndex int) {
// 终止条件
if startIndex >= len(s) {
tmp := make([]string, len(path))
copy(tmp, path)
result = append(result, tmp)
return
}
// 单层搜索逻辑
for i := startIndex; i < len(s); i++ {
// 这里判断子串如果不是回文串则直接跳过
if !isPalindrome(s, startIndex, i) {
continue
}
path = append(path, s[startIndex:i+1])
backtracking(s, i+1)
// 回溯
path = path[:len(path)-1]
}
}
backtracking(s, 0)
return result
}
评论前必须登录!
注册