Construct lexicographically smallest palindrome
Given a string of lowercase alphabets. Some of characters of given string got corrupted and are now represented by *. We can replace * with any of lowercase alphabets. You have to construct lexicographically smallest palindrome string. If it is not possible to construct a palindrome print “Not Possible”.
Examples:
Input : str[] = "bc*b" Output : bccb Input : str[] = "bc*a*cb" Output : bcaaacb Input : str[] = "bac*cb" Output : Not Possible
Start traversing the string from both end. Say with i=0, j=strlen-1, keep increasing i and decreasing j after every single iteration till i exceeds j. Now at any intermediate position we have five possible case :
- str[i] and str[j] both are same and also not equal to ‘*’. In this case simply continue.
- str[i] and str[j] both are same and are equal to ‘*’. Here you must fill str[i] = str[j] = ‘a’ for smallest possible palindrome.
- str[i] equals to ‘*’ and str[j] is some alphabet. Here fill str[i] = str[j] to make our string a palindrome.
- str[j] equals to ‘*’ and str[i] is some alphabet. Here fill str[j] = str[i] to make our string a palindrome.
- str[i] is not equals to str[j] and also both are some alphabet. In this case palindrome construction is not possible. So, print “Not Possible” and break from loop.
After i exceeds j means we have got our required palindrome. Else we got “Not possible” as result.
Implementation:
C++
// CPP for constructing smallest palindrome #include <bits/stdc++.h> using namespace std; // function for printing palindrome string constructPalin(string str, int len) { int i = 0, j = len - 1; // iterate till i<j for (; i < j; i++, j--) { // continue if str[i]==str[j] if (str[i] == str[j] && str[i] != '*' ) continue ; // update str[i]=str[j]='a' if both are '*' else if (str[i] == str[j] && str[i] == '*' ) { str[i] = 'a' ; str[j] = 'a' ; continue ; } // update str[i]=str[j] if only str[i]='*' else if (str[i] == '*' ) { str[i] = str[j]; continue ; } // update str[j]=str[i] if only str[j]='*' else if (str[j] == '*' ) { str[j] = str[i]; continue ; } // else print not possible and return cout << "Not Possible" ; return "" ; } return str; } // driver program int main() { string str = "bca*xc**b" ; int len = str.size(); cout << constructPalin(str, len); return 0; } |
Java
// Java for constructing smallest palindrome class GFG { // function for printing palindrome static String constructPalin( char []str, int len) { int i = 0 , j = len - 1 ; // iterate till i<j for (; i < j; i++, j--) { // continue if str[i]==str[j] if (str[i] == str[j] && str[i] != '*' ) continue ; // update str[i]=str[j]='a' if both are '*' else if (str[i] == str[j] && str[i] == '*' ) { str[i] = 'a' ; str[j] = 'a' ; continue ; } // update str[i]=str[j] if only str[i]='*' else if (str[i] == '*' ) { str[i] = str[j]; continue ; } // update str[j]=str[i] if only str[j]='*' else if (str[j] == '*' ) { str[j] = str[i]; continue ; } // else print not possible and return System.out.println( "Not Possible" ); return "" ; } return String.valueOf(str); } // Driver code public static void main(String[] args) { String str = "bca*xc**b" ; int len = str.length(); System.out.println(constructPalin(str.toCharArray(), len)); } } // This code is contributed by 29AjayKumar |
Python3
# Python3 for constructing smallest palindrome # function for printing palindrome def constructPalin(string, l): string = list (string) i = - 1 j = l # iterate till i<j while i < j: i + = 1 j - = 1 # continue if str[i]==str[j] if (string[i] = = string[j] and string[i] ! = '*' ): continue # update str[i]=str[j]='a' if both are '*' elif (string[i] = = string[j] and string[i] = = '*' ): string[i] = 'a' string[j] = 'a' continue # update str[i]=str[j] if only str[i]='*' elif string[i] = = '*' : string[i] = string[j] continue # update str[j]=str[i] if only str[j]='*' elif string[j] = = '*' : string[j] = string[i] continue # else print not possible and return print ( "Not Possible" ) return "" return ''.join(string) # Driver Code if __name__ = = "__main__" : string = "bca*xc**b" l = len (string) print (constructPalin(string, l)) # This code is contributed by # sanjeev2552 |
C#
// C# for constructing smallest palindrome using System; class GFG { // function for printing palindrome static String constructPalin( char []str, int len) { int i = 0, j = len - 1; // iterate till i<j for (; i < j; i++, j--) { // continue if str[i]==str[j] if (str[i] == str[j] && str[i] != '*' ) continue ; // update str[i]=str[j]='a' if both are '*' else if (str[i] == str[j] && str[i] == '*' ) { str[i] = 'a' ; str[j] = 'a' ; continue ; } // update str[i]=str[j] if only str[i]='*' else if (str[i] == '*' ) { str[i] = str[j]; continue ; } // update str[j]=str[i] if only str[j]='*' else if (str[j] == '*' ) { str[j] = str[i]; continue ; } // else print not possible and return Console.WriteLine( "Not Possible" ); return "" ; } return String.Join( "" ,str); } // Driver code public static void Main(String[] args) { String str = "bca*xc**b" ; int len = str.Length; Console.WriteLine(constructPalin(str.ToCharArray(), len)); } } // This code contributed by Rajput-Ji |
PHP
<?php // PHP for constructing smallest palindrome // function for printing palindrome function constructPalin( $str , $len ) { $i = 0; $j = $len - 1; // iterate till i<j for (; $i < $j ; $i ++, $j --) { // continue if str[i]==str[j] if ( $str [ $i ] == $str [ $j ] && $str [ $i ] != '*' ) continue ; // update str[i]=str[j]='a' if both are '*' else if ( $str [ $i ] == $str [ $j ] && $str [ $i ] == '*' ) { $str [ $i ] = 'a' ; $str [ $j ] = 'a' ; continue ; } // update str[i]=str[j] if only str[i]='*' else if ( $str [ $i ] == '*' ) { $str [ $i ] = $str [ $j ]; continue ; } // update str[j]=str[i] if only str[j]='*' else if ( $str [ $j ] == '*' ) { $str [ $j ] = $str [ $i ]; continue ; } // else print not possible and return echo "Not Possible" ; return "" ; } return $str ; } // Driver Code $str = "bca*xc**b" ; $len = strlen ( $str ); echo constructPalin( $str , $len ); // This code is contributed by ita_c ?> |
Javascript
<script> // javascript for constructing smallest palindrome // function for printing palindrome function constructPalin(str, len) { var i = 0, j = len - 1; // iterate till i<j for (; i < j; i++, j--) { // continue if str[i]==str[j] if (str[i] == str[j] && str[i] != '*' ) continue ; // update str[i]=str[j]='a' if both are '*' else if (str[i] == str[j] && str[i] == '*' ) { str[i] = 'a' ; str[j] = 'a' ; continue ; } // update str[i]=str[j] if only str[i]='*' else if (str[i] == '*' ) { str[i] = str[j]; continue ; } // update str[j]=str[i] if only str[j]='*' else if (str[j] == '*' ) { str[j] = str[i]; continue ; } // else print not possible and return document.write( "Not Possible" ); return "" ; } return str.join( "" ); } // driver program var str = "bca*xc**b" .split( "" ); var len = str.length; document.write( constructPalin(str, len)); </script> |
bcacxcacb
Time Complexity: O(n)
Auxiliary Space: O(1)
This article is contributed by Aarti_Rathi. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please Login to comment...