题目描述:
解:
区间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];
}
}