📜  形成最短回文的最小插入(1)

📅  最后修改于: 2023-12-03 14:54:15.163000             🧑  作者: Mango

形成最短回文的最小插入

在字符串操作中,实现将一个字符串转化为回文字符串是一个常见的问题。回文字符串就是正序和倒序读取一样的字符串,例如"aba"和"abba"都是回文字符串。

当我们需要将一个字符串转化为回文字符串时,可以在字符串中插入一些字符,使得插入后的字符串成为回文字符串。插入字符的数量越少,代价就越小。那么如何求出插入最少的字符数呢?

我们可以使用动态规划的方法,具体步骤如下:

  1. 定义状态:dp[i][j]表示将字符串s[i...j]变成回文字符串所需要插入的最少字符数。

  2. 定义状态转移方程:根据[i,j]区间之间的字符是否相同,每次将区间缩小为[i+1,j-1],[i+1,j],[i,j-1]三个区间进行计算。

    a. 如果s[i]==s[j],则dp[i][j]=dp[i+1][j-1]。

    b. 如果s[i]!=s[j],则dp[i][j]=min(dp[i+1][j], dp[i][j-1])+1。

  3. 定义边界条件:对于长度为1的字符串,dp[i][i]=0。

  4. 最终结果:dp[0][n-1],n为字符串s的长度。

下面是Python实现的代码片段:

def minInsertions(s: str) -> int:
    n = len(s)
    dp = [[float('inf')] * n for _ in range(n)]
    
    # 初始化len=1的状态
    for i in range(n):
        dp[i][i] = 0
    
    # 状态转移,从下往上,从左往右依次计算
    for i in range(n-2, -1, -1):
        for j in range(i+1, n):
            if s[i] == s[j]:
                dp[i][j] = dp[i+1][j-1]
            else:
                dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1
    
    return dp[0][n-1]

该算法的时间复杂度为O(n^2),空间复杂度也为O(n^2)。