Finden Sie heraus, ob die Zeichenfolge ein K-Palindrom ist oder nicht | Satz 2

Finden Sie anhand einer Zeichenfolge heraus, ob die Zeichenfolge ein K-Palindrom ist oder nicht. Eine K-Palindrom-Zeichenfolge verwandelt sich in ein Palindrom, wenn höchstens k Zeichen daraus entfernt werden.
Beispiele: 
 

  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. 


 

Empfohlene Praxis K-Palindrom Probieren Sie es aus!


Wir haben eine DP-Lösung in besprochen vorherige Beitrag, in dem wir gesehen haben, dass das Problem im Grunde eine Variation von ist Entfernung bearbeiten Problem. In diesem Beitrag wird eine weitere interessante DP-Lösung besprochen.
Die Idee besteht darin, die längste palindromische Teilfolge der gegebenen Zeichenfolge zu finden. Wenn die Differenz zwischen der längsten palindromischen Teilsequenz und der ursprünglichen Zeichenfolge kleiner als k ist, handelt es sich bei der Zeichenfolge um ein k-Palindrom, andernfalls handelt es sich nicht um ein k-Palindrom.
Zum Beispiel die längste palindromische Teilfolge einer Zeichenfolge abcdeca Ist accdca (oder Aceca). Die Zeichen, die nicht zur längsten palindromischen Teilsequenz der Zeichenfolge beitragen, sollten entfernt werden, um die Zeichenfolge palindromisch zu machen. Wenn Sie also b und d (oder e) aus der Abcdeca-Zeichenfolge entfernen, wird dies in ein Palindrom umgewandelt.
Die längste palindromische Teilfolge einer Zeichenfolge kann mithilfe von leicht gefunden werden LCS . Im Folgenden finden Sie die zweistufige Lösung zum Finden der längsten palindromischen Teilsequenz, die LCS verwendet. 
 

  1. Kehren Sie die angegebene Sequenz um und speichern Sie die Umkehrung in einem anderen Array, beispielsweise rev[0..n-1]
  2. LCS der gegebenen Sequenz und rev[] ist die längste palindromische Sequenz.


Nachfolgend finden Sie die Umsetzung der obigen Idee:
 

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     +     1    n     +     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>   

Ausgabe
Yes 

Zeitkomplexität der obigen Lösung ist O(n 2 ). 
Hilfsraum vom Programm verwendet wird, ist O(n 2 ). Es kann weiter auf O(n) reduziert werden, indem verwendet wird Platzoptimierte Lösung von LCS .
Dank Schlucht, die du verengt hast für den oben genannten Lösungsvorschlag.