Open In App

Construct lexicographically smallest palindrome

Last Updated : 27 Jul, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

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 : 

  1. str[i] and str[j] both are same and also not equal to ‘*’. In this case simply continue.
  2. 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.
  3. str[i] equals to ‘*’ and str[j] is some alphabet. Here fill str[i] = str[j] to make our string a palindrome.
  4. str[j] equals to ‘*’ and str[i] is some alphabet. Here fill str[j] = str[i] to make our string a palindrome.
  5. 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>


Output

bcacxcacb

Time Complexity: O(n)
Auxiliary Space: O(1)

 



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads