Given a string str some of whose characters are missing and are represented by a ‘*’. The task is to substitute the missing characters so as to make the lexicographically smallest palindrome. If it ot possible to make the string palindrome then print -1.
Examples:
Input: str = “ab*a”
Output: abba
Input: a*b
Output: -1
We can’t make it palindrome so output is -1.
Approach:
- Place the ‘i’ marker at the starting of string and ‘j’ marker at the end of the string.
- If characters at both the positions are missing then substitute both the characters with ‘a’ so as to make it lexicographically smallest palindrome.
- If character at only ith or jth position is missing then replace it with jth or ith character respectively.
- If character at ith and jth positions are not equal then the string cannot be made into a palindrome and print -1.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;// Function to return the lexicographically// smallest palindrome that can be made from// the given string after replacing// the required charactersstring makePalindrome(string str){ int i = 0, j = str.length() - 1; while (i <= j) { // If characters are missing at both the positions // then substitute it with 'a' if (str[i] == '*' && str[j] == '*') { str[i] = 'a'; str[j] = 'a'; } // If only str[j] = '*' then update it // with the value at str[i] else if (str[j] == '*') str[j] = str[i]; // If only str[i] = '*' then update it // with the value at str[j] else if (str[i] == '*') str[i] = str[j]; // If characters at both positions // are not equal and != '*' then the string // cannot be made palindrome else if (str[i] != str[j]) return "-1"; i++; j--; } // Return the required palindrome return str;}// Driver codeint main(){ string str = "na*an"; cout << makePalindrome(str); return 0;} |
Java
// Java implementation of the approachclass GFG {// Function to return the lexicographically// smallest palindrome that can be made from// the given string after replacing// the required charactersstatic String makePalindrome(char[] str){ int i = 0, j = str.length - 1; while (i <= j) { // If characters are missing at both the positions // then substitute it with 'a' if (str[i] == '*' && str[j] == '*') { str[i] = 'a'; str[j] = 'a'; } // If only str[j] = '*' then update it // with the value at str[i] else if (str[j] == '*') str[j] = str[i]; // If only str[i] = '*' then update it // with the value at str[j] else if (str[i] == '*') str[i] = str[j]; // If characters at both positions // are not equal and != '*' then the string // cannot be made palindrome else if (str[i] != str[j]) return "-1"; i++; j--; } // Return the required palindrome return String.valueOf(str);}// Driver codepublic static void main(String[] args){ char[] str = "na*an".toCharArray(); System.out.println(makePalindrome(str));}}/* This code contributed by PrinciRaj1992 */ |
Python3
# Python3 implementation of the approach# Function to return the lexicographically# smallest palindrome that can be made from# the given string after replacing# the required charactersdef makePalindrome(str1): i = 0 j = len(str1) - 1 str1 = list(str1) while (i <= j): # If characters are missing # at both the positions # then substitute it with 'a' if (str1[i] == '*' and str1[j] == '*'): str1[i] = 'a' str1[j] = 'a' # If only str1[j] = '*' then update it # with the value at str1[i] elif (str1[j] == '*'): str1[j] = str1[i] # If only str1[i] = '*' then update it # with the value at str1[j] elif (str1[i] == '*'): str1[i] = str1[j] # If characters at both positions # are not equal and != '*' then the string # cannot be made palindrome elif (str1[i] != str1[j]): str1 = '' . join(str1) return "-1" i += 1 j -= 1 # Return the required palindrome str1 = '' . join(str1) return str1# Driver codeif __name__ == '__main__': str1 = "na*an" print(makePalindrome(str1)) # This code is contributed by# Surendra_Gangwar |
C#
// C# implementation of the approachusing System; class GFG {// Function to return the lexicographically// smallest palindrome that can be made from// the given string after replacing// the required charactersstatic String makePalindrome(char[] str){ int i = 0, j = str.Length - 1; while (i <= j) { // If characters are missing at both the positions // then substitute it with 'a' if (str[i] == '*' && str[j] == '*') { str[i] = 'a'; str[j] = 'a'; } // If only str[j] = '*' then update it // with the value at str[i] else if (str[j] == '*') str[j] = str[i]; // If only str[i] = '*' then update it // with the value at str[j] else if (str[i] == '*') str[i] = str[j]; // If characters at both positions // are not equal and != '*' then the string // cannot be made palindrome else if (str[i] != str[j]) return "-1"; i++; j--; } // Return the required palindrome return String.Join("",str);}// Driver codepublic static void Main(String[] args){ char[] str = "na*an".ToCharArray(); Console.WriteLine(makePalindrome(str));}}// This code has been contributed by 29AjayKumar |
PHP
<?php// PHP implementation of the approach // Function to return the lexicographically // smallest palindrome that can be made from // the given string after replacing // the required characters function makePalindrome($str) { $i = 0; $j = strlen($str) - 1; while ($i <= $j) { // If characters are missing at both the positions // then substitute it with 'a' if ($str[$i] == '*' && $str[$j] == '*') { $str[$i] = 'a'; $str[$j] = 'a'; } // If only str[j] = '*' then update it // with the value at str[i] else if ($str[$j] == '*') $str[$j] = $str[$i]; // If only str[i] = '*' then update it // with the value at str[j] else if ($str[$i] == '*') $str[$i] = $str[$j]; // If characters at both positions // are not equal and != '*' then the string // cannot be made palindrome else if ($str[$i] != $str[$j]) return "-1"; $i++; $j--; } // Return the required palindrome return $str; } // Driver code $str = "na*an"; echo makePalindrome($str); // This Code is contributed by AnkitRai01?> |
Javascript
<script>// Javascript implementation of the approach// Function to return the lexicographically// smallest palindrome that can be made from// the given string after replacing// the required charactersfunction makePalindrome(str){ var i = 0, j = str.length - 1; while (i <= j) { // If characters are missing at both the positions // then substitute it with 'a' if (str[i] == '*' && str[j] == '*') { str[i] = 'a'; str[j] = 'a'; } // If only str[j] = '*' then update it // with the value at str[i] else if (str[j] == '*') str[j] = str[i]; // If only str[i] = '*' then update it // with the value at str[j] else if (str[i] == '*') str[i] = str[j]; // If characters at both positions // are not equal and != '*' then the string // cannot be made palindrome else if (str[i] != str[j]) return "-1"; i++; j--; } // Return the required palindrome return str.join("");}// Driver codevar str = "na*an".split('');document.write(makePalindrome(str));</script> |
naaan
Time Complexity: O(n), where n is the length of the given string.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

… [Trackback]
[…] Read More Information here on that Topic: geeksforgeeks.org/make-lexicographically-smallest-palindrome-by-substituting-missing-characters/ […]
… [Trackback]
[…] Here you will find 16233 additional Info to that Topic: geeksforgeeks.org/make-lexicographically-smallest-palindrome-by-substituting-missing-characters/ […]