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]