logo

Kleinste palindroom na vervanging

Gegeven een string die enkele kleine letters bevat en één speciaal teken punt(.). We moeten alle punten vervangen door een bepaald alfabetteken op zo'n manier dat de resulterende string een palindroom wordt. In het geval van veel mogelijke vervangingen moeten we een palindroomstring kiezen die lexicografisch het kleinst is. Als het niet mogelijk is om de string na alle mogelijke vervangingen om te zetten in een palindroom, dan is de uitvoer Niet mogelijk. 

Voorbeelden:  

Input : str = ab..e.c.a Output : abcaeacba The smallest palindrome which can be made after replacement is 'abcaeacba' We replaced first dot with 'c' second dot with 'a' third dot with 'a' and fourth dot with 'b' Input : str = ab..e.c.b Output : Not Possible It is not possible to convert above string into palindrome

We kunnen dit probleem als volgt oplossen. Omdat de resulterende string een palindroom moet zijn, kunnen we een paar niet-punttekens controleren bij het starten van zichzelf. Als ze niet overeenkomen, is directe terugkeer niet mogelijk omdat we een nieuw teken alleen op de positie van punten kunnen plaatsen en nergens anders. 



Daarna herhalen we de karakters van de string als het huidige karakter een punt is. Vervolgens controleren we het gepaarde karakter ervan (karakter op (n – i -1)de positie). Als dat karakter ook een punt is, kunnen we beide karakters vervangen door ‘a’ omdat ‘a’ het kleinste alfabet in kleine letters is, wat de kleinste lexicografische string aan het einde garandeert. Het vervangen van beide door een ander karakter zal resulteren in een lexicografisch grotere palindroomstring. In andere gevallen, als het gepaarde teken geen punt is, moeten we, om een ​​stringpalindroom te maken, het huidige teken vervangen door het gepaarde teken. 

So in short If both 'i' and 'n- i- 1' are dot replace them by ‘a’ If one of them is a dot character replace that by other non-dot character

Bovenstaande procedure geeft ons lexicografisch de kleinste palindroomreeks. 

Uitvoering:

C++
// C++ program to get lexicographically smallest // palindrome string #include    using namespace std; // Utility method to check str is possible palindrome // after ignoring . bool isPossiblePalindrome(string str) {  int n = str.length();  for (int i=0; i<n/2; i++)  {  /* If both left and right character are not  dot and they are not equal also then it  is not possible to make this string a  palindrome */  if (str[i] != '.' &&  str[n-i-1] != '.' &&  str[i] != str[n-i-1])  return false;  }  return true; } // Returns lexicographically smallest palindrom // string if possible string smallestPalindrome(string str) {  if (!isPossiblePalindrome(str))  return 'Not Possible';  int n = str.length();  // loop through character of string  for (int i = 0; i < n; i++)  {  if (str[i] == '.')  {  // if one of character is dot replace dot  // with other character  if (str[n - i - 1] != '.')  str[i] = str[n - i - 1];  // if both character are dot then replace  // them with smallest character 'a'  else  str[i] = str[n - i - 1] = 'a';  }  }  // return the result  return str; } // Driver code to test above methods int main() {  string str = 'ab..e.c.a';  cout << smallestPalindrome(str) << endl;  return 0; } 
Java
// Java program to get lexicographically  // smallest palindrome string class GFG  { // Utility method to check str is // possible palindrome after ignoring static boolean isPossiblePalindrome(char str[]) { int n = str.length; for (int i = 0; i < n / 2; i++) {  /* If both left and right character   are not dot and they are not   equal also then it is not   possible to make this string a  palindrome */  if (str[i] != '.' &&  str[n - i - 1] != '.' &&  str[i] != str[n - i - 1])  return false; } return true; } // Returns lexicographically smallest  // palindrome string if possible static void smallestPalindrome(char str[]) { if (!isPossiblePalindrome(str))  System.out.println('Not Possible'); int n = str.length; // loop through character of string for (int i = 0; i < n; i++) {  if (str[i] == '.')  {  // if one of character is dot   // replace dot with other character  if (str[n - i - 1] != '.')  str[i] = str[n - i - 1];  // if both character are dot   // then replace them with   // smallest character 'a'  else  str[i] = str[n - i - 1] = 'a';  } } // return the result for(int i = 0; i < n; i++)  System.out.print(str[i] + ''); } // Driver code public static void main(String[] args) {  String str = 'ab..e.c.a';  char[] s = str.toCharArray();  smallestPalindrome(s); } } // This code is contributed  // by ChitraNayal 
Python 3
# Python 3 program to get lexicographically  # smallest palindrome string # Utility method to check str is  # possible palindrome after ignoring  def isPossiblePalindrome(str): n = len(str) for i in range(n // 2): # If both left and right character  # are not dot and they are not  # equal also then it is not possible  # to make this string a palindrome  if (str[i] != '.' and str[n - i - 1] != '.' and str[i] != str[n - i - 1]): return False return True # Returns lexicographically smallest # palindrome string if possible def smallestPalindrome(str): if (not isPossiblePalindrome(str)): return 'Not Possible' n = len(str) str = list(str) # loop through character of string for i in range(n): if (str[i] == '.'): # if one of character is dot  # replace dot with other character if (str[n - i - 1] != '.'): str[i] = str[n - i - 1] # if both character are dot  # then replace them with  # smallest character 'a' else: str[i] = str[n - i - 1] = 'a' # return the result return str # Driver code if __name__ == '__main__': str = 'ab..e.c.a' print(''.join(smallestPalindrome(str))) # This code is contributed by ChitraNayal 
C#
// C# program to get lexicographically  // smallest palindrome string using System; public class GFG   {  // Utility method to check str is  // possible palindrome after ignoring  static bool isPossiblePalindrome(char []str)  {  int n = str.Length;  for (int i = 0; i < n / 2; i++)  {  /* If both left and right character   are not dot and they are not   equal also then it is not   possible to make this string a  palindrome */  if (str[i] != '.' &&  str[n - i - 1] != '.' &&  str[i] != str[n - i - 1])  return false;  }  return true;  }  // Returns lexicographically smallest   // palindrome string if possible  static void smallestPalindrome(char []str)  {  if (!isPossiblePalindrome(str))  Console.WriteLine('Not Possible');  int n = str.Length;  // loop through character of string  for (int i = 0; i < n; i++)  {  if (str[i] == '.')  {  // if one of character is dot   // replace dot with other character  if (str[n - i - 1] != '.')  str[i] = str[n - i - 1];  // if both character are dot   // then replace them with   // smallest character 'a'  else  str[i] = str[n - i - 1] = 'a';  }  }  // return the result  for(int i = 0; i < n; i++)  Console.Write(str[i] + '');  }  // Driver code  public static void Main()  {  String str = 'ab..e.c.a';  char[] s = str.ToCharArray();  smallestPalindrome(s);  } } // This code is contributed by PrinciRaj1992 
PHP
 // PHP program to get lexicographically // smallest palindrome string // Utility method to check str is // possible palindrome after ignoring function isPossiblePalindrome($str) { $n = strlen($str); for ($i = 0; $i < $n / 2; $i++) { /* If both left and right   character are not dot and   they are not equal also then   it is not possible to make this   string a palindrome */ if ($str[$i] != '.' && $str[$n - $i - 1] != '.' && $str[$i] != $str[$n - $i - 1]) return false; } return true; } // Returns lexicographically smallest  // palindrome string if possible function smallestPalindrome($str) { if (!isPossiblePalindrome($str)) return 'Not Possible'; $n = strlen($str); // loop through character of string for ($i= 0; $i < $n; $i++) { if ($str[$i] == '.') { // if one of character is dot  // replace dot with other character if ($str[$n - $i - 1] != '.') $str[$i] = $str[$n - $i - 1]; // if both character are dot  // then replace them with  // smallest character 'a' else $str[$i] = $str[$n - $i - 1] = 'a'; } } // return the result return $str; } // Driver code $str = 'ab..e.c.a'; echo smallestPalindrome($str); // This code is contributed  // by ChitraNayal ?> 
JavaScript
<script> // Javascript program to get lexicographically  // smallest palindrome string    // Utility method to check str is  // possible palindrome after ignoring  function isPossiblePalindrome(str)  {  let n = str.length;  for (let i = 0; i < Math.floor(n / 2); i++)  {  /* If both left and right character   are not dot and they are not   equal also then it is not   possible to make this string a  palindrome */  if (str[i] != '.' &&  str[n - i - 1] != '.' &&  str[i] != str[n - i - 1])  return false;  }    return true;  }    // Returns lexicographically smallest   // palindrome string if possible  function smallestPalindrome(str)  {  if (!isPossiblePalindrome(str))  document.write('Not Possible');    let n = str.length;    // loop through character of string  for (let i = 0; i < n; i++)  {  if (str[i] == '.')  {  // if one of character is dot   // replace dot with other character  if (str[n - i - 1] != '.')  str[i] = str[n - i - 1];    // if both character are dot   // then replace them with   // smallest character 'a'  else  str[i] = str[n - i - 1] = 'a';  }  }    // return the result  for(let i = 0; i < n; i++)  document.write(str[i] + '');    }    // Driver code  let str='ab..e.c.a';  let s = str.split('');  smallestPalindrome(s);    // This code is contributed by rag2127   </script> 

Uitvoer
abcaeacba

Tijdcomplexiteit: O(n) waarbij n de lengte van de string is.
Complexiteit van de hulpruimte: O(1)