本质还是基于跨域的s[i]==s[k]对dp解的优化
-
为了避免dp[i][j]初始值为0影响min判断需要初始化该点为
dp[i][j]=min(j-i+1,dp[i+1,j]+1)
-
对于
s=1213
,s[0]与s[2]相等,从0到k=2连续打印1是最优解,所以可以将[0,k-1](删除k不会影响打印的次数,只要还是为了避免j==k的情况)与[k+1,3]划分为两段求最优解,dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j])
-
如果s[0]与s[2]不相等,那么试试别的k取值能不能优化dp
class Solution:
dp=[]
def helper(self,ss,dp,x,y):
if x>y:
return 0
if x==y:
return 1
if dp[x][y]!=0:
return dp[x][y]
# 当k!=x的时候,k与x相等可以对dp优化,k并入x的打印过程中
# 当k==x的时候说明该点不存在优化可能,但是后面[x+1,y]说不定有,for循环里面无法适配该情况得单列
dp[x][y]=min(y-x+1,self.helper(ss,dp,x+1,y)+1)
# 如果没法优化那就默认一个点打印一次y-x+1
# if ss[x]==ss[y]:
# dp[x][y]=min(dp[x][y],self.helper(ss,dp,x,y-1))
for k in range(x+1,y+1):
if ss[x]==ss[k]:
dp[x][y]=min(dp[x][y],self.helper(ss,dp,x,k-1)+self.helper(ss,dp,k+1,y))
return dp[x][y]
def strangePrinter(self, s: str) -> int:
if s=="":
return 0
ss=s[0]
# 合并重复的连续字符因为不影响打印次数
for i in range(1,len(s)):
if s[i]!=s[i-1]:
ss+=s[i]
length=len(ss)
dp=[[0]*length for i in range(length)]
return self.helper(ss,dp,0,length-1)
网友评论