// An LCS based program to find minimum number insertions needed to
// make a string palindrome
#include <cstdio>
#include <cstring>
#include <cstdlib>
/* Utility function to get max of 2 integers */
int max(int a, int b)
{ return (a > b)? a : b; }
//this method uses only 2 arrays of length of string ** space optimization**
int lcs(char *str1,char *str2,int n,int m)
{
int len1,len2,i,j;
len1=n;
len2=m;
int *x=new int[max(len1,len2)+1];
int *y=new int[max(len1,len2)+1];
for(i=0;i<=len1;i++)
y[i]=x[i]=0;
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++)
{
if(str1[i-1]==str2[j-1])
y[j]=x[j-1]+1;
else
y[j] = y[j-1] > x[j] ? y[j-1] : x[j];
}
int * t;
t = x;
x = y;
y = t;
}
int len=x[n];
delete x;
delete y;
return len;
}
// LCS based function to find minimum number of insersions
int findMinInsertionsLCS(char str[], int n)
{
// Creata another string to store reverse of 'str'
char rev[n+1];
strcpy(rev, str);
int i=0,j=n-1;
while(i<j)
{
char tmp=rev[i];
rev[i]=rev[j];
rev[j]=tmp;
i++;
j--;
}
return (n - lcs(str, rev, n, n));
}
// Driver program to test above functions
int main()
{
char str[] = "geeks";
printf("%d", findMinInsertionsLCS(str, strlen(str)));
return 0;
}
Ly8gQW4gTENTIGJhc2VkIHByb2dyYW0gdG8gZmluZCBtaW5pbXVtIG51bWJlciBpbnNlcnRpb25zIG5lZWRlZCB0bwovLyBtYWtlIGEgc3RyaW5nIHBhbGluZHJvbWUKI2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxjc3RkbGliPgoKLyogVXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgbWF4IG9mIDIgaW50ZWdlcnMgKi8KaW50IG1heChpbnQgYSwgaW50IGIpCnsgICByZXR1cm4gKGEgPiBiKT8gYSA6IGI7IH0KIAovL3RoaXMgbWV0aG9kIHVzZXMgb25seSAyIGFycmF5cyBvZiBsZW5ndGggb2Ygc3RyaW5nICoqIHNwYWNlIG9wdGltaXphdGlvbioqCmludCBsY3MoY2hhciAqc3RyMSxjaGFyICpzdHIyLGludCBuLGludCBtKQp7CiAKCWludCBsZW4xLGxlbjIsaSxqOwoJbGVuMT1uOwoJbGVuMj1tOwoJaW50ICp4PW5ldyBpbnRbbWF4KGxlbjEsbGVuMikrMV07CglpbnQgKnk9bmV3IGludFttYXgobGVuMSxsZW4yKSsxXTsKCglmb3IoaT0wO2k8PWxlbjE7aSsrKQoJCXlbaV09eFtpXT0wOwoKCWZvcihpPTE7aTw9bGVuMTtpKyspCgl7CgkJZm9yKGo9MTtqPD1sZW4yO2orKykKCQl7CgkJCWlmKHN0cjFbaS0xXT09c3RyMltqLTFdKQoJCQkJeVtqXT14W2otMV0rMTsKCQkJZWxzZQoJCQkJeVtqXSA9IHlbai0xXSA+IHhbal0gPyB5W2otMV0gOiB4W2pdOwoJCX0KCQlpbnQgKiB0OwoJCXQgPSB4OwoJCXggPSB5OwoJCXkgPSB0OwoJfQoJCglpbnQgbGVuPXhbbl07CglkZWxldGUgeDsKCWRlbGV0ZSB5OwoKCXJldHVybiBsZW47Cn0KIAovLyBMQ1MgYmFzZWQgZnVuY3Rpb24gdG8gZmluZCBtaW5pbXVtIG51bWJlciBvZiBpbnNlcnNpb25zCmludCBmaW5kTWluSW5zZXJ0aW9uc0xDUyhjaGFyIHN0cltdLCBpbnQgbikKewogICAvLyBDcmVhdGEgYW5vdGhlciBzdHJpbmcgdG8gc3RvcmUgcmV2ZXJzZSBvZiAnc3RyJwogICBjaGFyIHJldltuKzFdOwogICBzdHJjcHkocmV2LCBzdHIpOwogICBpbnQgaT0wLGo9bi0xOwogICB3aGlsZShpPGopCiAgIHsKICAgCQljaGFyIHRtcD1yZXZbaV07CiAgIAkJcmV2W2ldPXJldltqXTsKICAgCQlyZXZbal09dG1wOwogICAJCWkrKzsKICAgCQlqLS07CiAgIH0KCiAgIHJldHVybiAobiAtIGxjcyhzdHIsIHJldiwgbiwgbikpOwp9CiAKLy8gRHJpdmVyIHByb2dyYW0gdG8gdGVzdCBhYm92ZSBmdW5jdGlvbnMKaW50IG1haW4oKQp7CiAgICBjaGFyIHN0cltdID0gImdlZWtzIjsKICAgIHByaW50ZigiJWQiLCBmaW5kTWluSW5zZXJ0aW9uc0xDUyhzdHIsIHN0cmxlbihzdHIpKSk7CiAgICByZXR1cm4gMDsKfQ==