Convert string to palindrome string with minimum insertions

23,220

Solution 1

Let S[i, j] represents a sub-string of string S starting from index i and ending at index j (both inclusive) and c[i, j] be the optimal solution for S[i, j].

Obviously, c[i, j] = 0 if i >= j.

In general, we have the recurrence:

enter image description here

Solution 2

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<<output<<reverse(output);
 //You may have to be careful about odd sized palindromes here,
 // I haven't accounted for that, it just needs one simple check

Does that make better reading?

Share:
23,220
whitepearl
Author by

whitepearl

Software Engineer

Updated on October 19, 2020

Comments

  • whitepearl
    whitepearl over 3 years

    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 reverse. Therefore the number of insertions to be made is length(s) - length(lcs_string)

    What method should be employed to find the equivalent palindrome string on knowing the number of insertions to be made?

    For example :

    1) azbzczdzez

    Number of insertions required : 5 Palindrome string : azbzcezdzeczbza

    Although multiple palindrome strings may exist for the same string but I want to find only one palindrome?

  • whitepearl
    whitepearl almost 12 years
    Thank you @kyun. But I successfully found out the number of insertions to be made. I have specified that I need to find the palindrome string formed after insertions? Can you give me a optimal solution? Thanking you in advance.
  • foobar
    foobar over 7 years
    this solution won't give right answer in most of the cases. Try OROP , only 1 character is required, ie P in the beginning, but your solution will give answer 2.
  • Abhijit Sarkar
    Abhijit Sarkar about 5 years
    Explain the recurrence.
  • Abhijit Sarkar
    Abhijit Sarkar about 5 years
    "If you'd like more explanation on why this is true, post a comment"? Why don't you explain anyway, if you can, instead of baiting?