7.11 - hard - 29

132. Palindrome Partitioning II
這題的思路多了一重,先弄出dp[i][j] 代表 s[i:j+1]是否是palindrome。然后在用一個(gè)d[i]表示 從 s[0:i+1]最少要切多少刀。d[i] = min(d[i], d[j-1]+1 if dp[j][i] is True for j in 0~i)

在實(shí)際做的時(shí)候,只想到了第一重,第二重d[i] 沒想出來,其實(shí)也是有點(diǎn)著急了。再花點(diǎn)時(shí)間應(yīng)該也還是能想出來的。

對(duì)于第一重dp來說又是一個(gè)對(duì)角線結(jié)構(gòu)。可以用k距離來做,j = i + k 這樣就不用把i的循環(huán)倒序了。

class Solution(object):
    def minCut(self, s):
        """
        :type s: str
        :rtype: int
        """
        dp = [[False for _ in range(len(s))] for _ in range(len(s))]
        for i in range(len(s))[::-1]:
            for j in range(i, len(s)):
                if i == j:
                    dp[i][j] = True
                elif j - i == 1:
                    dp[i][j] = s[i] == s[j]
                else:
                    dp[i][j] = (s[i] == s[j]) and dp[i+1][j-1]
        d  = [sys.maxint for _ in range(len(s))]
        
        # dp[i] is min cut for s[0~i] include i
        for i in range(len(s)):
            if dp[0][i]:
                d[i] = 0
        for i in range(len(s)):
            for j in range(i+1):
                if dp[j][i]: # j~i includsive is true
                    d[i] = min(d[i], d[j-1]+1)
        
        return d[-1]
        
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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