需求

要求输入一个字符串,将此字符串分割成一些子串,使每个子串都是回文串(单字符的字符串也属于回文串)。

例如输入字符串"abb",则返回:

["a", "b", "b"],
["a", "bb"],

思路

本题的核心是将字符串分割出多个回文的子字符串。判断某个字符串是不是回文字符串非常简单,我们直接将字符串进行逆序,然后判断与原字符串是否相同即可。 对字符串进行分割的过程实际上是一个递归的过程,解决本题使用递归函数将非常容易。

实现

package chapter07

// 判断是否回文
func isPal(s string) bool {
    return s == reverse(s)
}

// 字符串倒序
func reverse(s string) string {
    r := []rune(s)
    for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
        r[i], r[j] = r[j], r[i]
    }
    return string(r)
}

// 递归进行分割
func clipStr(start int, s []rune, l [][]rune, res [][][]rune) [][][]rune {
    // 如果已经到达字符串的末尾,则将结果添加到结果集中
    if start > len(string(s))-1 {
        res = append(res, l)
        return res
    }

    for i := start + 1; i < len(s)+1; i++ {
        // 如果是回文,递归继续分割
        if isPal(string(s[start:i])) {
            res = clipStr(i, s, append(l, s[start:i]), res)
        }
    }
    return res
}

func partition(str string) [][]string {
    var res [][][]rune
    res = clipStr(0, []rune(str), [][]rune{}, [][][]rune{})
    var ret [][]string
    for _, v := range res {
        var s []string
        for _, vv := range v {
            s = append(s, string(vv))
        }
        ret = append(ret, s)
    }
    return ret
}