logo

Hitta om strängen är k-palindrome eller inte | Set 2

Med tanke på en sträng, ta reda på om strängen är k-palindrom eller inte. En K-Palindrome-sträng förvandlas till en palindrom vid att ta bort de flesta K-tecken från den.
Exempel: 
 

  Input :   String - abcdecba k = 1   Output :   Yes String can become palindrome by removing 1 character i.e. either d or e   Input :   String - abcdeca K = 2   Output :   Yes Can become palindrome by removing 2 characters b and e (or b and d).   Input :   String - acdcb K = 1   Output :   No String can not become palindrome by removing only one character.


 



Rekommenderad övning K-palindrom Försök!


Vi har diskuterat en DP -lösning i tidigare post där vi såg att problemet i princip är en variant av Redigera avstånd problem. I det här inlägget diskuteras en annan intressant DP -lösning.
Tanken är att hitta den längsta palindromiska efterföljande av den givna strängen. Om skillnaden mellan längsta palindromisk efterföljande och den ursprungliga strängen är mindre än lika med K, är strängen K-palindrome annars är det inte K-palindrome.
Till exempel längsta palindromisk efterföljande sträng abcdeca är accdca (eller aceca). De tecken som inte bidrar till den längsta palindromiska efterföljande av strängen bör tas bort för att göra strängen palindrom. Så vid avlägsnande av B och D (eller E) från ABCDECA -strängen kommer att förvandlas till en palindrom.
Längsta palindromisk efterföljande av en sträng kan lätt hittas med LC . Följande är tvåstegslösningen för att hitta den längsta palindromiska efterföljande som använder LCS. 
 

  1. Vänd den givna sekvensen och lagra baksidan i en annan matris säger Rev [0..n-1]
  2. LC: er för den givna sekvensen och rev [] kommer att vara den längsta palindromiska sekvensen.


Nedan är implementeringen av ovanstående idé -
 

CPP
// C++ program to find if given string is K-Palindrome // or not #include    using namespace std; /* Returns length of LCS for X[0..m-1] Y[0..n-1] */ int lcs( string X string Y int m int n ) {  int L[m + 1][n + 1];  /* Following steps build L[m+1][n+1] in bottom up  fashion. Note that L[i][j] contains length of  LCS of X[0..i-1] and Y[0..j-1] */  for (int i = 0; i <= m; i++)  {  for (int j = 0; j <= n; j++)  {  if (i == 0 || j == 0)  L[i][j] = 0;  else if (X[i - 1] == Y[j - 1])  L[i][j] = L[i - 1][j - 1] + 1;  else  L[i][j] = max(L[i - 1][j] L[i][j - 1]);  }  }  // L[m][n] contains length of LCS for X and Y  return L[m][n]; } // find if given string is K-Palindrome or not bool isKPal(string str int k) {  int n = str.length();  // Find reverse of string  string revStr = str;  reverse(revStr.begin() revStr.end());  // find longest palindromic subsequence of  // given string  int lps = lcs(str revStr n n);  // If the difference between longest palindromic  // subsequence and the original string is less  // than equal to k then the string is k-palindrome  return (n - lps <= k); } // Driver program int main() {  string str = 'abcdeca';  int k = 2;  isKPal(str k) ? cout << 'Yes' : cout << 'No';  return 0; } 
Java
// Java program to find if given  // String is K-Palindrome or not import java.util.*; import java.io.*; class GFG  {  /* Returns length of LCS for  X[0..m-1] Y[0..n-1] */  static int lcs(String X String Y  int m int n)   {  int L[][] = new int[m + 1][n + 1];  /* Following steps build L[m+1][n+1]  in bottom up fashion. Note that L[i][j]   contains length of LCS of X[0..i-1]  and Y[0..j-1] */  for (int i = 0; i <= m; i++)  {  for (int j = 0; j <= n; j++)   {  if (i == 0 || j == 0)   {  L[i][j] = 0;  }   else if (X.charAt(i - 1) == Y.charAt(j - 1))  {  L[i][j] = L[i - 1][j - 1] + 1;  }   else  {  L[i][j] = Math.max(L[i - 1][j] L[i][j - 1]);  }  }  }  // L[m][n] contains length   // of LCS for X and Y   return L[m][n];  }  // find if given String is  // K-Palindrome or not   static boolean isKPal(String str int k)   {  int n = str.length();  // Find reverse of String   StringBuilder revStr = new StringBuilder(str);  revStr = revStr.reverse();  // find longest palindromic   // subsequence of given String   int lps = lcs(str revStr.toString() n n);  // If the difference between longest   // palindromic subsequence and the   // original String is less than equal   // to k then the String is k-palindrome   return (n - lps <= k);  }  // Driver code   public static void main(String[] args)   {  String str = 'abcdeca';  int k = 2;  if (isKPal(str k))  {  System.out.println('Yes');  }  else  System.out.println('No');  } } // This code is contributed by Rajput-JI 
Python3
# Python program to find # if given string is K-Palindrome # or not # Returns length of LCS # for X[0..m-1] Y[0..n-1]  def lcs(X Y m n ): L = [[0]*(n+1) for _ in range(m+1)] # Following steps build # L[m+1][n+1] in bottom up # fashion. Note that L[i][j] # contains length of # LCS of X[0..i-1] and Y[0..j-1]  for i in range(m+1): for j in range(n+1): if not i or not j: L[i][j] = 0 elif X[i - 1] == Y[j - 1]: L[i][j] = L[i - 1][j - 1] + 1 else: L[i][j] = max(L[i - 1][j] L[i][j - 1]) # L[m][n] contains length # of LCS for X and Y return L[m][n] # find if given string is # K-Palindrome or not def isKPal(string k): n = len(string) # Find reverse of string revStr = string[::-1] # find longest palindromic # subsequence of # given string lps = lcs(string revStr n n) # If the difference between # longest palindromic # subsequence and the original # string is less # than equal to k then # the string is k-palindrome return (n - lps <= k) # Driver program string = 'abcdeca' k = 2 print('Yes' if isKPal(string k) else 'No') # This code is contributed # by Ansu Kumari. 
C#
// C# program to find if given  // String is K-Palindrome or not  using System; class GFG  {   /* Returns length of LCS for   X[0..m-1] Y[0..n-1] */  static int lcs(String X String Y   int m int n)   {   int []L = new int[m + 1n + 1];   /* Following steps build L[m+1n+1]   in bottom up fashion. Note that L[ij]   contains length of LCS of X[0..i-1]   and Y[0..j-1] */  for (int i = 0; i <= m; i++)   {   for (int j = 0; j <= n; j++)   {   if (i == 0 || j == 0)   {   L[i j] = 0;   }   else if (X[i - 1] == Y[j - 1])   {   L[i j] = L[i - 1 j - 1] + 1;   }   else  {   L[i j] = Math.Max(L[i - 1 j]  L[i j - 1]);   }   }   }     // L[mn] contains length   // of LCS for X and Y   return L[m n];   }   // find if given String is   // K-Palindrome or not   static bool isKPal(String str int k)   {   int n = str.Length;   // Find reverse of String   str = reverse(str);   // find longest palindromic   // subsequence of given String   int lps = lcs(str str n n);   // If the difference between longest   // palindromic subsequence and the   // original String is less than equal   // to k then the String is k-palindrome   return (n - lps <= k);   }   static String reverse(String input)  {  char[] temparray = input.ToCharArray();  int left right = 0;  right = temparray.Length - 1;  for (left = 0; left < right; left++ right--)   {    // Swap values of left and right   char temp = temparray[left];  temparray[left] = temparray[right];  temparray[right] = temp;  }  return String.Join(''temparray);  }    // Driver code   public static void Main(String[] args)   {   String str = 'abcdeca';   int k = 2;   if (isKPal(str k))   {   Console.WriteLine('Yes');   }   else  Console.WriteLine('No');   }  }  // This code is contributed by PrinciRaj1992 
JavaScript
<script> // JavaScript program to find // if given string is K-Palindrome // or not // Returns length of LCS // for X[0..m-1] Y[0..n-1]  function lcs(X Y m n ){  let L = new Array(m+1);  for(let i=0;i<m+1;i++){  L[i] = new Array(n+1).fill(0);  }  // Following steps build  // L[m+1][n+1] in bottom up  // fashion. Note that L[i][j]  // contains length of  // LCS of X[0..i-1] and Y[0..j-1]   for(let i = 0; i < m + 1; i++)  {  for(let j = 0; j < n + 1; j++)  {  if(!i || !j)  L[i][j] = 0  else if(X[i - 1] == Y[j - 1])  L[i][j] = L[i - 1][j - 1] + 1  else  L[i][j] = Math.max(L[i - 1][j] L[i][j - 1])  }  }  // L[m][n] contains length  // of LCS for X and Y  return L[m][n] } // find if given string is // K-Palindrome or not function isKPal(string k){  let n = string.length  // Find reverse of string  let revStr = string.split('').reverse().join('')  // find longest palindromic  // subsequence of  // given string  let lps = lcs(string revStr n n)  // If the difference between  // longest palindromic  // subsequence and the original  // string is less  // than equal to k then  // the string is k-palindrome  return (n - lps <= k) } // Driver program let string = 'abcdeca' let k = 2 document.write(isKPal(string k)?'Yes' : 'No') // This code is contributed by shinjanpatra </script> 

Produktion
Yes

Tidskomplexitet av ovanstående lösning är o (n2). 
Hjälputrymme används av programmet är o (n2). Det kan ytterligare reduceras till o (n) med hjälp av Rymdoptimerad lösning av LCS .
Tack vare Ravin du smalade för att föreslå ovanstående lösning.