Уклоните знак из низа да бисте га учинили палиндромом

Дати стринг морамо да проверимо да ли је могуће да овај стринг буде палиндром након што из њега уклонимо тачно један карактер. 

Примери:   

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  

Овај проблем можемо решити проналажењем положаја неслагања. Почињемо да петљамо у низу тако што држимо два показивача на оба краја који прелазе ка средњој позицији након сваке итерације, ова итерација ће се зауставити када пронађемо неподударање јер је дозвољено уклонити само један знак, овде имамо два избора

У случају неподударања или уклоните знак на који показује леви показивач или уклоните знак на који показује десни показивач.

Проверићемо оба случаја, запамтите пошто смо прешли једнак број корака са обе стране, овај средњи низ би такође требало да буде палиндром након уклањања једног знака, тако да проверавамо два подниза један уклањањем левог знака и један уклањањем десног знака и ако је један од њих палиндром онда можемо да направимо комплетан палиндром низа уклањањем одговарајућег знака и ако оба подниза нису потпуна, онда оба подстринга нису потпуна. под датим ограничењем. 

Имплементација:

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  

Временска сложеност: О(Н)
Сложеност простора: О(1)

 

Креирај квиз

Топ Чланци

Категорија