本题解通过动态规划方法求解字符串成为回文串的最少插入次数。思路是先求出给定字符串的最长回文子序列的长度(使用动态规划表dp),然后用字符串的总长度减去这个最长回文子序列的长度,得到的结果即为最少的插入次数。动态规划表dp[i]表示从索引i到字符串末尾的子字符串中的最长回文子序列的长度。通过逐个比较字符,如果字符相同,则更新dp表;如果不同,则将dp[j]更新为dp[j]和dp[j-1]中的较大值。
时间复杂度: O(n^2)
空间复杂度: O(n)
class Solution:
def minInsertions(self, s: str) -> int:
n = len(s)
if n <= 1 or s[::-1] == s:
return 0
dp = [0]*n # dp数组,存储从i到n-1的最长回文子序列长度
for i in range(n-1, -1, -1):
temp = 0 # 临时变量,用于优化dp的更新过程
dp[i] = 1
for j in range(i+1, n):
if s[i] == s[j]:
temp, dp[j] = dp[j], temp + 2 # 如果s[i] == s[j], 更新dp[j]为temp + 2
else:
temp = dp[j]
if dp[j-1] > dp[j]:
dp[j] = dp[j-1] # 选择dp[j]和dp[j-1]中较大的值作为新的dp[j]
return n - dp[-1] # 返回需要插入的字符数量