Видаліть символ із рядка, щоб зробити його паліндромом

Дано рядок, нам потрібно перевірити, чи можливо зробити цей рядок паліндромом після видалення рівно одного символу з нього. 

приклади:   

Input : str = abcba Output : Yes we can remove character ‘c’ to make string palindrome Input : str = abcbea Output : Yes we can remove character ‘e’ to make string palindrome Input : str = abecbea It is not possible to make this string palindrome just by removing one character  

Ми можемо вирішити цю задачу, знайшовши позицію невідповідності. Ми починаємо цикл у рядку, зберігаючи два покажчики на обох кінцях, які переміщуються до середини після кожної ітерації. Ця ітерація зупиняється, коли ми знаходимо невідповідність, оскільки дозволено видалити лише один символ, у нас є два варіанти

У разі невідповідності або видаліть символ, на який вказує лівий вказівник, або видаліть символ, на який вказує правий вказівник.

Ми перевіримо обидва випадки, пам’ятайте, що оскільки ми пройшли однакову кількість кроків з обох сторін, цей середній рядок також має бути паліндромом після видалення одного символу, тому ми перевіряємо два підрядки, один видаливши лівий символ, а другий видаливши правий символ. Якщо один із них є паліндромом, ми можемо створити повний паліндром рядка, видаливши відповідний символ, а якщо обидва підрядки не є паліндромом, то неможливо зробити повний рядок a паліндром при заданому обмеженні. 

Реалізація:

C++
   // C/C++ program to check whether it is possible to make   // string palindrome by removing one character   #include          using     namespace     std  ;   // Utility method to check if substring from low to high is   // palindrome or not.   bool     isPalindrome  (  string  ::  iterator     low       string  ::  iterator     high  )   {      while     (  low      <     high  )      {      if     (  *  low     !=     *  high  )      return     false  ;      low  ++  ;      high  --  ;      }      return     true  ;   }   // This method returns -1 if it is not possible to make string   // a palindrome. It returns -2 if string is already a palindrome.   // Otherwise it returns index of character whose removal can   // make the whole string palindrome.   int     possiblePalinByRemovingOneChar  (  string     str  )   {      // Initialize low and high by both the ends of the string      int     low     =     0       high     =     str  .  length  ()     -     1  ;      // loop until low and high cross each other      while     (  low      <     high  )      {      // If both characters are equal then move both pointer      // towards end      if     (  str  [  low  ]     ==     str  [  high  ])      {      low  ++  ;      high  --  ;      }      else      {      /* If removing str[low] makes the whole string palindrome.    We basically check if substring str[low+1..high] is    palindrome or not. */      if     (  isPalindrome  (  str  .  begin  ()     +     low     +     1       str  .  begin  ()     +     high  ))      return     low  ;      /* If removing str[high] makes the whole string palindrome    We basically check if substring str[low+1..high] is    palindrome or not. */      if     (  isPalindrome  (  str  .  begin  ()     +     low       str  .  begin  ()     +     high     -     1  ))      return     high  ;      return     -1  ;      }      }      // We reach here when complete string will be palindrome      // if complete string is palindrome then return mid character      return     -2  ;   }   // Driver code to test above methods   int     main  ()   {      string     str     =     'abecbea'  ;      int     idx     =     possiblePalinByRemovingOneChar  (  str  );      if     (  idx     ==     -1  )      cout      < <     'Not Possible   n  '  ;      else     if     (  idx     ==     -2  )      cout      < <     'Possible without removing any character'  ;      else      cout      < <     'Possible by removing character'       < <     ' at index '      < <     idx      < <     '  n  '  ;      return     0  ;   }   
Java
   // Java program to check whether    // it is possible to make string    // palindrome by removing one character   import     java.util.*  ;   class   GFG      {      // Utility method to check if       // substring from low to high is      // palindrome or not.      static     boolean     isPalindrome  (  String     str           int     low       int     high  )      {      while     (  low      <     high  )         {      if     (  str  .  charAt  (  low  )     !=     str  .  charAt  (  high  ))      return     false  ;      low  ++  ;      high  --  ;      }      return     true  ;      }      // This method returns -1 if it is       // not possible to make string a palindrome.       // It returns -2 if string is already       // a palindrome. Otherwise it returns       // index of character whose removal can      // make the whole string palindrome.      static     int     possiblePalinByRemovingOneChar  (  String     str  )      {      // Initialize low and right       // by both the ends of the string      int     low     =     0       high     =     str  .  length  ()     -     1  ;      // loop until low and      // high cross each other      while     (  low      <     high  )         {      // If both characters are equal then       // move both pointer towards end      if     (  str  .  charAt  (  low  )     ==     str  .  charAt  (  high  ))         {      low  ++  ;      high  --  ;      }         else      {      /*    * If removing str[low] makes the     * whole string palindrome. We basically     * check if substring str[low+1..high]    * is palindrome or not.    */      if     (  isPalindrome  (  str       low     +     1       high  ))      return     low  ;      /*    * If removing str[high] makes the whole string     * palindrome. We basically check if substring     * str[low+1..high] is palindrome or not.    */      if     (  isPalindrome  (  str       low       high     -     1  ))      return     high  ;      return     -  1  ;      }      }      // We reach here when complete string       // will be palindrome if complete string       // is palindrome then return mid character      return     -  2  ;      }      // Driver Code      public     static     void     main  (  String  []     args  )      {      String     str     =     'abecbea'  ;      int     idx     =     possiblePalinByRemovingOneChar  (  str  );      if     (  idx     ==     -  1  )      System  .  out  .  println  (  'Not Possible'  );      else     if     (  idx     ==     -  2  )      System  .  out  .  println  (  'Possible without '     +         'removing any character'  );      else      System  .  out  .  println  (  'Possible by removing'     +         ' character at index '     +     idx  );      }   }   // This code is contributed by   // sanjeev2552   
Python3
   # Python program to check whether it is possible to make   # string palindrome by removing one character   # Utility method to check if substring from    # low to high is palindrome or not.   def   isPalindrome  (  string  :   str     low  :   int     high  :   int  )   ->   bool  :   while   low    <   high  :   if   string  [  low  ]   !=   string  [  high  ]:   return   False   low   +=   1   high   -=   1   return   True   # This method returns -1 if it    # is not possible to make string   # a palindrome. It returns -2 if    # string is already a palindrome.   # Otherwise it returns index of   # character whose removal can   # make the whole string palindrome.   def   possiblepalinByRemovingOneChar  (  string  :   str  )   ->   int  :   # Initialize low and right by   # both the ends of the string   low   =   0   high   =   len  (  string  )   -   1   # loop until low and high cross each other   while   low    <   high  :   # If both characters are equal then   # move both pointer towards end   if   string  [  low  ]   ==   string  [  high  ]:   low   +=   1   high   -=   1   else  :   # If removing str[low] makes the whole string palindrome.   # We basically check if substring str[low+1..high] is   # palindrome or not.   if   isPalindrome  (  string     low   +   1     high  ):   return   low   # If removing str[high] makes the whole string palindrome   # We basically check if substring str[low+1..high] is   # palindrome or not   if   isPalindrome  (  string     low     high   -   1  ):   return   high   return   -  1   # We reach here when complete string will be palindrome   # if complete string is palindrome then return mid character   return   -  2   # Driver Code   if   __name__   ==   '__main__'  :   string   =   'abecbea'   idx   =   possiblepalinByRemovingOneChar  (  string  )   if   idx   ==   -  1  :   print  (  'Not possible'  )   else   if   idx   ==   -  2  :   print  (  'Possible without removing any character'  )   else  :   print  (  'Possible by removing character at index'     idx  )   # This code is contributed by   # sanjeev2552   
C#
   // C# program to check whether    // it is possible to make string    // palindrome by removing one character   using     System  ;   class     GFG      {      // Utility method to check if       // substring from low to high is      // palindrome or not.      static     bool     isPalindrome  (  string     str       int     low       int     high  )      {      while     (  low      <     high  )         {      if     (  str  [  low  ]     !=     str  [  high  ])      return     false  ;      low  ++  ;      high  --  ;      }      return     true  ;      }      // This method returns -1 if it is       // not possible to make string a palindrome.       // It returns -2 if string is already       // a palindrome. Otherwise it returns       // index of character whose removal can      // make the whole string palindrome.      static     int     possiblePalinByRemovingOneChar  (  string     str  )      {      // Initialize low and right       // by both the ends of the string      int     low     =     0       high     =     str  .  Length     -     1  ;      // loop until low and      // high cross each other      while     (  low      <     high  )         {      // If both characters are equal then       // move both pointer towards end      if     (  str  [  low  ]     ==     str  [  high  ])         {      low  ++  ;      high  --  ;      }         else      {      /*    * If removing str[low] makes the     * whole string palindrome. We basically     * check if substring str[low+1..high]    * is palindrome or not.    */      if     (  isPalindrome  (  str       low     +     1       high  ))      return     low  ;      /*    * If removing str[high] makes the whole string     * palindrome. We basically check if substring     * str[low+1..high] is palindrome or not.    */      if     (  isPalindrome  (  str       low       high     -     1  ))      return     high  ;      return     -  1  ;      }      }      // We reach here when complete string       // will be palindrome if complete string       // is palindrome then return mid character      return     -  2  ;      }      // Driver Code      public     static     void     Main  (  String  []     args  )      {      string     str     =     'abecbea'  ;      int     idx     =     possiblePalinByRemovingOneChar  (  str  );      if     (  idx     ==     -  1  )      Console  .  Write  (  'Not Possible'  );      else     if     (  idx     ==     -  2  )      Console  .  Write  (  'Possible without '     +         'removing any character'  );      else      Console  .  Write  (  'Possible by removing'     +         ' character at index '     +     idx  );      }   }   // This code is contributed by shivanisinghss2110   
JavaScript
    <  script  >   // JavaScript program to check whether    // it is possible to make string    // palindrome by removing one character   // Utility method to check if    // substring from low to high is   // palindrome or not.   function     isPalindrome  (  str       low       high  )      {      while     (  low      <     high  )         {      if     (  str  .  charAt  (  low  )     !=     str  .  charAt  (  high  ))      return     false  ;      low  ++  ;      high  --  ;      }      return     true  ;      }      // This method returns -1 if it is       // not possible to make string a palindrome.       // It returns -2 if string is already       // a palindrome. Otherwise it returns       // index of character whose removal can      // make the whole string palindrome.      function     possiblePalinByRemovingOneChar  (  str  )      {      // Initialize low and right       // by both the ends of the string      var     low     =     0       high     =     str  .  length     -     1  ;      // loop until low and      // high cross each other      while     (  low      <     high  )         {      // If both characters are equal then       // move both pointer towards end      if     (  str  .  charAt  (  low  )     ==     str  .  charAt  (  high  ))         {      low  ++  ;      high  --  ;      }         else      {      /*    * If removing str[low] makes the     * whole string palindrome. We basically     * check if substring str[low+1..high]    * is palindrome or not.    */      if     (  isPalindrome  (  str       low     +     1       high  ))      return     low  ;      /*    * If removing str[high] makes the whole string     * palindrome. We basically check if substring     * str[low+1..high] is palindrome or not.    */      if     (  isPalindrome  (  str       low       high     -     1  ))      return     high  ;      return     -  1  ;      }      }      // We reach here when complete string       // will be palindrome if complete string       // is palindrome then return mid character      return     -  2  ;      }      // Driver Code      var     str     =     'abecbea'  ;      var     idx     =     possiblePalinByRemovingOneChar  (  str  );      if     (  idx     ==     -  1  )      document  .  write  (  'Not Possible'  );      else     if     (  idx     ==     -  2  )      document  .  write  (  'Possible without '     +         'removing any character'  );      else      document  .  write  (  'Possible by removing'     +         ' character at index '     +     idx  );   // this code is contributed by shivanisinghss2110    <  /script>   

Вихід
Not Possible  

Часова складність: O(N)
Просторова складність: O(1)

 

Створіть вікторину