131. Palindrome Partitioning

题目链接:131

思路

对于要求 “求出所有可能”的题目,dfs 是必不可少的,这道题也是一样。

本题的关键点在于如何减少dfs过程中对 字符串是否为回文串 的重复判断。使用 dp 可以将字符串的每一个子区间是否是回文串记录下来,从而减少重复判断。但是对于本题来说,并不是每一个子区间都会被判断到,因此只需要在正常判断后加一个buffer记录就可以了,没必要专门使用dp进行预处理。

// string = palindrome part + unpalindrome part
var ans [][]string
var prefix []string
var palindromeBuffer map[string]bool

func partition(s string) [][]string {
    ans = make([][]string, 0)
    prefix = make([]string, 0)
    palindromeBuffer = make(map[string]bool)
    dfs(s)
    return ans
}

func dfs(s string) {
    // base case
    if len(s) < 1 {
        prefixCp := make([]string, len(prefix))
        copy(prefixCp, prefix)
        ans = append(ans, prefixCp)
        return
    }
    for i := 1; i <= len(s); i++ {
        if isPalindrome(s[:i]) {
            prefix = append(prefix, s[:i])
            dfs(s[i:])
            prefix = prefix[:len(prefix)-1]
        }
    }
}

func isPalindrome(s string) bool {
    val, ok := palindromeBuffer[s]
    if ok {
        return val
    }
    for i := 0; i < len(s); i++ {
        if s[i] != s[len(s)-1-i] {
            palindromeBuffer[s] = false
            return false
        }
    }
    palindromeBuffer[s] = true
    return true
}

时间复杂度:O(n * 2n),其中 n 是字符串 s 的长度。在最坏情况下,s 包含 n 个完全相同的字符。长度为 n 的字符串的划分方案数为 2n-1,每一种划分方法需要 O(n) 的时间求出内部所有小块是否为回文串,因此总时间复杂度为 O(2n)。

空间复杂度:O(n * 2n)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容