664. 奇怪的打印机
难度困难295
有台奇怪的打印机有以下两个特殊要求:
- 打印机每次只能打印由 同一个字符 组成的序列。
- 每次可以在从起始到结束的任意位置打印新字符,并且会覆盖掉原来已有的字符。
给你一个字符串 s
,你的任务是计算这个打印机打印它需要的最少打印次数。
示例 1:
输入:s = "aaabbb"
输出:2
解释:首先打印 "aaa" 然后打印 "bbb"。
示例 2:
输入:s = "aba"
输出:2
解释:首先打印 "aaa" 然后在第二个位置打印 "b" 覆盖掉原来的字符 'a'。
提示:
1 <= s.length <= 100
s
由小写英文字母组成
class Solution {
public int strangePrinter(String s) {
int n = s.length();
// 状态定义:第一维->区间起点 第二维->区间终点
int[][] dp = new int[n+1][n+1];
for(int len = 1; len <= n; len++){
//1. 枚举区间长度
for(int l = 0; l+len-1 < n; l++){
//2. 枚举起点
int r = l + len - 1;
dp[l][r] = dp[l+1][r] + 1;
for(int k = l+1; k <= r; k++){
//3.枚举转移过程中的"合并"位置
if(s.charAt(l) == s.charAt(k)){
dp[l][r] = Math.min(dp[l][r], dp[l][k-1]+dp[k+1][r]);
}
}
}
}
//f[0][n - 1]就是所求的最小操作数所在的位置
return dp[0][n-1];
}
}