LeetCode 131 [Palindrome Partitioning]

原題

給定一個字符串s,將s分割成一些子串,使每個子串都是回文串。
返回s所有可能的回文串分割方案。

樣例
給出 s = "aab",返回

[
  ["aa", "b"],
  ["a", "a", "b"]
]

解題思路

  • 求所有答案,首先排除動態(tài)規(guī)劃,應(yīng)該是DFS (Palindrome Partitioning II 求個數(shù)才是動歸)
  • 遇到要求所有組合、可能、排列等解集的題目,一般都是DFS + backtracking
  • 首先傳入s="aab" path=[] res = [], 首先切割出"a"(然后是"aa" "aab" ...),然后判讀它是不是回文串:
  • 如果不是,直接跳過
  • 如果是,則此時剩余的 s="ab", path += ["a"]
  • 寫入res的判斷是,當(dāng)s=""時,記錄結(jié)果
  • 優(yōu)化:可以通過用DP來計算任意s[i:j]是否是回文,并保存結(jié)果,再執(zhí)行DFS,如果發(fā)現(xiàn)某條string不是回文,就可以直接退出,從而減少計算量

完整代碼

class Solution(object):
    def partition(self, s):
        """
        :type s: str
        :rtype: List[List[str]]
        """
        if not s:
            return [[]]
        path = []
        result = []
        self.helper(s, path, result)
        return result
        
    def helper(self, str, path, result):
        if not str:
            result.append(path)
        for i in range(1, len(str) + 1):
            prefix = str[:i]
            if self.isPalindrome(prefix):
                self.helper(str[i:], path + [prefix], result)
        
    def isPalindrome(self, str):
        for i in range(len(str)):
            if str[i] != str[len(str) - i - 1]: return False
        return True
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容