Construct lexicographically smallest palindrome
Last Updated :
27 Jul, 2022
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++
#include <bits/stdc++.h>
using namespace std;
string constructPalin(string str, int len)
{
int i = 0, j = len - 1;
for (; i < j; i++, j--) {
if (str[i] == str[j] && str[i] != '*' )
continue ;
else if (str[i] == str[j] && str[i] == '*' ) {
str[i] = 'a' ;
str[j] = 'a' ;
continue ;
}
else if (str[i] == '*' ) {
str[i] = str[j];
continue ;
}
else if (str[j] == '*' ) {
str[j] = str[i];
continue ;
}
cout << "Not Possible" ;
return "" ;
}
return str;
}
int main()
{
string str = "bca*xc**b" ;
int len = str.size();
cout << constructPalin(str, len);
return 0;
}
|
Java
class GFG
{
static String constructPalin( char []str, int len)
{
int i = 0 , j = len - 1 ;
for (; i < j; i++, j--)
{
if (str[i] == str[j] && str[i] != '*' )
continue ;
else if (str[i] == str[j] &&
str[i] == '*' )
{
str[i] = 'a' ;
str[j] = 'a' ;
continue ;
}
else if (str[i] == '*' )
{
str[i] = str[j];
continue ;
}
else if (str[j] == '*' )
{
str[j] = str[i];
continue ;
}
System.out.println( "Not Possible" );
return "" ;
}
return String.valueOf(str);
}
public static void main(String[] args)
{
String str = "bca*xc**b" ;
int len = str.length();
System.out.println(constructPalin(str.toCharArray(), len));
}
}
|
Python3
def constructPalin(string, l):
string = list (string)
i = - 1
j = l
while i < j:
i + = 1
j - = 1
if (string[i] = = string[j] and
string[i] ! = '*' ):
continue
elif (string[i] = = string[j] and
string[i] = = '*' ):
string[i] = 'a'
string[j] = 'a'
continue
elif string[i] = = '*' :
string[i] = string[j]
continue
elif string[j] = = '*' :
string[j] = string[i]
continue
print ( "Not Possible" )
return ""
return ''.join(string)
if __name__ = = "__main__" :
string = "bca*xc**b"
l = len (string)
print (constructPalin(string, l))
|
C#
using System;
class GFG
{
static String constructPalin( char []str, int len)
{
int i = 0, j = len - 1;
for (; i < j; i++, j--)
{
if (str[i] == str[j] && str[i] != '*' )
continue ;
else if (str[i] == str[j] &&
str[i] == '*' )
{
str[i] = 'a' ;
str[j] = 'a' ;
continue ;
}
else if (str[i] == '*' )
{
str[i] = str[j];
continue ;
}
else if (str[j] == '*' )
{
str[j] = str[i];
continue ;
}
Console.WriteLine( "Not Possible" );
return "" ;
}
return String.Join( "" ,str);
}
public static void Main(String[] args)
{
String str = "bca*xc**b" ;
int len = str.Length;
Console.WriteLine(constructPalin(str.ToCharArray(), len));
}
}
|
PHP
<?php
function constructPalin( $str , $len )
{
$i = 0;
$j = $len - 1;
for (; $i < $j ; $i ++, $j --)
{
if ( $str [ $i ] == $str [ $j ] &&
$str [ $i ] != '*' )
continue ;
else if ( $str [ $i ] == $str [ $j ] &&
$str [ $i ] == '*' )
{
$str [ $i ] = 'a' ;
$str [ $j ] = 'a' ;
continue ;
}
else if ( $str [ $i ] == '*' )
{
$str [ $i ] = $str [ $j ];
continue ;
}
else if ( $str [ $j ] == '*' )
{
$str [ $j ] = $str [ $i ];
continue ;
}
echo "Not Possible" ;
return "" ;
}
return $str ;
}
$str = "bca*xc**b" ;
$len = strlen ( $str );
echo constructPalin( $str , $len );
?>
|
Javascript
<script>
function constructPalin(str, len)
{
var i = 0, j = len - 1;
for (; i < j; i++, j--) {
if (str[i] == str[j] && str[i] != '*' )
continue ;
else if (str[i] == str[j] && str[i] == '*' ) {
str[i] = 'a' ;
str[j] = 'a' ;
continue ;
}
else if (str[i] == '*' ) {
str[i] = str[j];
continue ;
}
else if (str[j] == '*' ) {
str[j] = str[i];
continue ;
}
document.write( "Not Possible" );
return "" ;
}
return str.join( "" );
}
var str = "bca*xc**b" .split( "" );
var len = str.length;
document.write( constructPalin(str, len));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...