Convert string to palindrome string with minimum insertions

后端 未结 5 604
心在旅途
心在旅途 2020-12-31 14:42

In order to find the minimal number of insertions required to convert a given string(s) to palindrome I find the longest common subsequence of the string(lcs_string) and its

5条回答
  •  不思量自难忘°
    2020-12-31 15:04

    To elaborate on VenomFangs answer, there is a simple dynamic programming solution to this one. Note that I'm assuming the only operation allowed here is insertion of characters (no deletion, updates). Let S be a string of n characters. The simple recursion function P for this is:

        = P [i+1 .. j-1], if S[i] = S[j] 
    

    P[i..j]

        = min (P[i..j-1], P[i+1..j]) + 1,
    

    If you'd like more explanation on why this is true, post a comment and i'd be happy to explain (though its pretty easy to see with a little thought). This, by the way, is the exact opposite of the LCS function you use, hence validating that your solution is in fact optimal. Of course its wholly possible I bungled, if so, someone do let me know!

    Edit: To account for the palindrome itself, this can be easily done as follows: As stated above, P[1..n] would give you the number of insertions required to make this string a palindrome. Once the above two-dimensional array is built up, here's how you find the palindrome:

    Start with i=1, j=n. Now, string output = "";

    while(i < j)
    {
        if (P[i][j] == P[i+1][j-1]) //this happens if no insertions were made at this point
        {
            output = output + S[i];
            i++;
            j--;
        }
        else
        if (P[i][j] == P[i+1][j]) //
        {
            output = output + S[i];
            i++;
        }
        else
        {
            output = S[j] + output;
            j--;
        }
     }
     cout<

    Does that make better reading?

提交回复
热议问题