有台奇怪的印表機有以下兩個特殊要求:
印表機每次只能列印同乙個字串行。
每次可以在任意起始和結束位置列印新字元,並且會覆蓋掉原來已有的字元。
給定乙個只包含小寫英文本母的字串,你的任務是計算這個印表機列印它需要的最少次數。
示例 1:
輸入: 「aaabbb」
輸出: 2
解釋: 首先列印 「aaa」 然後列印 「bbb」。
示例 2:
輸入: 「aba」
輸出: 2
解釋: 首先列印 「aaa」 然後在第二個位置列印 「b」 覆蓋掉原來的字元 『a』。
難度:困難,假設dp代表第l個位置到r個位置之間的最小列印次數,對於任何的dp[l][r],都有dp[l][r] = dp[l+1][r] + 1,因為l肯定是第乙個列印的,
對應每乙個長度的i,假設i=1時,l的位置可以是0到n-i,假設l取0,那麼r=0+i-1=0,因此所有的i=1,有l=r,對應位置的dp[l][r]就等於1
假設i=4,l=0時,r=0+4-1=3,dp[0][3]=dp[1][3]+1,k可以取1、2、3,k遍歷是找到最小的次數,要找到按照k劃分還是維持當前dp[l][r]值那個最小
class
solution
:def
strangeprinter
(self, s:
str)
->
int:
ifnot s:
return
0 n =
len(s)
dp =[[
0]*(n+1)
for i in
range
(n+1)]
for i in
range(1
, n+1)
:for l in
range
(n-i+1)
:# 計算的時候保證小的已經算出來了
r = l + i -
1 dp[l]
[r]= dp[l+1]
[r]+
1for k in
range
(l+1
, r+1)
:if s[k]
== s[l]
: dp[l]
[r]=
min(dp[l]
[r], dp[l]
[k-1
]+dp[k+1]
[r])
return dp[0]
[n-1
]
Leetcode 664 奇怪的印表機
有台奇怪的印表機有以下兩個特殊要求 印表機每次只能列印同乙個字串行。每次可以在任意起始和結束位置列印新字元,並且會覆蓋掉原來已有的字元。給定乙個只包含小寫英文本母的字串,你的任務是計算這個印表機列印它需要的最少次數。示例 1 輸入 aaabbb 輸出 2 解釋 首先列印 aaa 然後列印 bbb 示...
奇怪的印表機 LeetCode664
有台奇怪的印表機有以下兩個特殊要求 印表機每次只能列印同乙個字串行。每次可以在任意起始和結束位置列印新字元,並且會覆蓋掉原來已有的字元。給定乙個只包含小寫英文本母的字串,你的任務是計算這個印表機列印它需要的最少次數。示例 1 輸入 aaabbb 輸出 2 解釋 首先列印 aaa 然後列印 bbb 示...
LeetCode 664 奇怪的印表機
動態規劃 先去重,再考慮狀態轉移 對於每個位置字元分別有兩種狀態,獨立列印或一同列印,再考慮到列印次數,一維的 dp i 不夠描述狀態 再加一維,每次連續列印時只考慮某2個字元屬於同乙個列印批次,列出狀態轉移方程 dp st,ed begin 1 dp st 1,ed dp st,i 1 dp i ...