有台奇怪的打印机有以下两个特殊要求:
- 打印机每次只能打印同一个字符序列。
- 每次可以在任意起始和结束位置打印新字符,并且会覆盖掉原来已有的字符。
给定一个只包含小写英文字母的字符串,你的任务是计算这个打印机打印它需要的最少次数。
示例 1:
输入: "aaabbb" 输出: 2 解释: 首先打印 "aaa" 然后打印 "bbb"。
示例 2:
输入: "aba" 输出: 2 解释: 首先打印 "aaa" 然后在第二个位置打印 "b" 覆盖掉原来的字符 'a'。
思路:DP+DFS
时间复杂度:O( n^2 ), 空间复杂:O( n^2 )
代码:
class Solution:
def strangePrinter(self, s):
"""
:type s: str
:rtype: int
"""
dp = [[0]* len(s) for _ in range(len(s))]
return self.robot(s,dp,0,len(s) -1)
def robot(self,s,dp,i,j):
if s == '':
return 0
if i == j:
return 1
if i > j:
return 0
if dp[i][j]:
return dp[i][j]
dp[i][j] = self.robot(s,dp,i+1,j) + 1
for k in range(i+1,j+1):
if s[k] == s[i]:
dp[i][j] = min(dp[i][j],self.robot(s,dp,i,k-1) + self.robot(s,dp,k+1,j))
return dp[i][j]