给出一个字符串s,分割s使得分割出的每一个子串都是回文串
计算将字符串s分割成回文分割结果的最小切割数
例如:给定字符串s="aab",
返回1,因为回文分割结果["aa","b"]是切割一次生成的。
package main
/**
*
* @param s string字符串
* @return int整型
*/
func minCut( s string ) int {
// write code here
cnt := make(map[int]int)
cnt[-1] = -1
cnt[0] = 0
for i := 1; i < len(s); i++ {
cnt[i] = i
for j := 0; j <= i; j++ {
subChar1 := s[i]
subChar2 := s[j]
if subChar1 == subChar2 {
subStr := s[j : i+1]
//fmt.Println(subStr)
r := []rune(subStr)
for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
if subStr == string(r) && ((1 + cnt[j-1]) < cnt[i]) {
cnt[i] = 1 + cnt[j-1]
}
}
}
}
//fmt.Println(cnt)
return cnt[len(s)-1]
}
给定一个字符串s,分割s使得s的每一个子串都是回文串
返回所有的回文分割结果。(注意:返回结果的顺序需要和输入字符串中的字母顺序一致。)
package main
/**
*
* @param s string字符串
* @return string字符串二维数组
*/
var res [][]string
var tmpRes []string
func partition(s string) [][]string {
//如果只有一位,则不需要后面的操作了
if len(s) <= 0 {
//注意切片是引用,不能直接把tmpRes塞给res,需要一个全新的切片
res = append(res, append([]string{}, tmpRes...))
return res
}
for i := 0; i < len(s); i++ {
subStr := s[:i+1]
r := []rune(subStr)
for i, j := 0, len(subStr)-1; i < j; i, j = i+1, j-1 {
r[i], r[j] = r[j], r[i]
}
//如果前面的部分是回文串
if subStr == string(r) {
tmpRes = append(tmpRes, subStr)
partition(s[i+1:])
tmpRes = tmpRes[:len(tmpRes)-1] //干掉新写进去这个值,保留前面的
}
}
return res
}