法1:DP
基本方法,必须掌握!
Python
class Solution:
def minInsertions(self, s: str) -> int:
n = len(s)
dp = [[0]*n for _ in range(n)]
for i in range(n-1, -1, -1):
for j in range(i+1, n):
if s[i] == s[j]:
dp[i][j] = 0 if j-i == 0 else dp[i+1][j-1]
else:
dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1
return dp[0][n-1]
Java
class Solution {
public int minInsertions(String s) {
int n = s.length();
if (n < 2) {
return 0;
}
int[][] dp = new int[n][n]; // 对于字符串s[i:j], 至少需要dp[i][j]次操作构成回文串
for (int i = n - 2; i >= 0; --i) {
for (int j = i + 1; j < n; ++j) {
if (s.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i + 1][j - 1];
} else {
dp[i][j] = Math.min(dp[i + 1][j], dp[i][j - 1]) + 1;
}
}
}
return dp[0][n - 1];
}
}