给出一个字符串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
}
这篇博客探讨了如何用Go语言解决两个问题:一是计算将字符串分割成回文子串的最小切割次数,二是返回所有可能的回文分割结果。提供的代码示例中,`minCut`函数通过动态规划计算最小切割次数,`partition`函数则生成所有可能的回文分割。这两个函数都涉及到字符串回文特性的判断和递归操作。
282

被折叠的 条评论
为什么被折叠?



