题目描述:

解:
区间DP
状态转移方程:
- 只打印left这个位置:
f[l][r] = f[l+1][r] + 1 - 打印left到k(s[l] = s[k]) :
f[l][r] = f[l][k-1] + f[k+1][r]
因为此时只保证了 l 和 k 位置字符相同,并不保证其中没有其他字符,所以应该取min值
区间DP一般就是枚举长度+枚举左端点+枚举分割点3重循环,复杂度
class Solution {public int strangePrinter(String s) {StringBuilder sb = new StringBuilder();for(int i=0; i<s.length(); ) {char c = s.charAt(i);sb.append(c);i++;while (i < s.length() && s.charAt(i) == c) {i++;}} //删除重复字符,减少dp匹配次数。s = sb.toString();int n = s.length();int[][] f = new int[n+1][n+1];for(int len = 1; len<=n; len++) { //枚举长度for(int l = 0; l+len-1 < n; l++) { //枚举左端点int r = l + len - 1;f[l][r] = f[l+1][r] + 1; //到左端点处for(int k = l+1; k<=r; k++) { //枚举分割点if(s.charAt(l) == s.charAt(k)) {f[l][r] = Math.min(f[l][r], f[l][k-1]+f[k+1][r]);}}}}return f[0][n-1];}}
