参考题解:官方题解
题目:
标签:
- 动态规划。
思路:
-
可以转化为 i 到 j 之间的打印最少次数。
-
初始条件:
dp[i][i] = 1
。 -
转移条件:如果字符串在 i 的位置和 j 的位置一样,则可以考虑前一个点,也就是
dp[i][j] = dp[i][j - 1]
。否则,考虑中间一个 k ,前半部分和后半部分求和,取最小值。 -
为了确保动态规划计算顺序,需要左指针 i 从右往左,右指针 j 从左往右。当然右指针必须在左指针右边。
题解:
class Solution {
public int strangePrinter(String s) {
int length = s.length();
int[][] dp = new int[length][length];
for (int i = 0; i < length; ++i) {
dp[i][i] = 1;
}
for (int i = length - 1; i >= 0; --i) {
for (int j = i + 1; j < length; ++j) {
if (s.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i][j - 1];
} else {
int m = Integer.MAX_VALUE;
for (int k = i; k < j; ++k) {
int temp = dp[i][k] + dp[k + 1][j];
if (temp < m) {
m = temp;
}
}
dp[i][j] = m;
}
}
}
return dp[0][length - 1];
}
}