Remove a character from a string to make it a palindrome
Last Updated :
06 Jul, 2022
Given a string, we need to check whether it is possible to make this string a palindrome after removing exactly one character from this.
Examples:
Input : str = “abcba”
Output : Yes
we can remove character ‘c’ to make string palindrome
Input : str = “abcbea”
Output : Yes
we can remove character ‘e’ to make string palindrome
Input : str = “abecbea”
It is not possible to make this string palindrome
just by removing one character
We can solve this problem by finding the position of mismatch. We start looping in the string by keeping two pointers at both the ends which traverse towards mid position after each iteration, this iteration will stop when we find a mismatch, as it is allowed to remove just one character we have two choices here,
At mismatch, either remove character pointed by left pointer or remove character pointed by right pointer.
We will check both the cases, remember as we have traversed equal number of steps from both sides, this mid string should also be a palindrome after removing one character, so we check two substrings, one by removing left character and one by removing right character and if one of them is palindrome then we can make complete string palindrome by removing corresponding character, and if both substrings are not palindrome then it is not possible to make complete string a palindrome under given constraint.
Implementation:
C++
// C/C++ program to check whether it is possible to make
// string palindrome by removing one character
#include <bits/stdc++.h>
using namespace std;
// Utility method to check if substring from low to high is
// palindrome or not.
bool isPalindrome(string::iterator low, string::iterator high)
{
while (low < high)
{
if (*low != *high)
return false;
low++;
high--;
}
return true;
}
// This method returns -1 if it is not possible to make string
// a palindrome. It returns -2 if string is already a palindrome.
// Otherwise it returns index of character whose removal can
// make the whole string palindrome.
int possiblePalinByRemovingOneChar(string str)
{
// Initialize low and high by both the ends of the string
int low = 0, high = str.length() - 1;
// loop until low and high cross each other
while (low < high)
{
// If both characters are equal then move both pointer
// towards end
if (str[low] == str[high])
{
low++;
high--;
}
else
{
/* If removing str[low] makes the whole string palindrome.
We basically check if substring str[low+1..high] is
palindrome or not. */
if (isPalindrome(str.begin() + low + 1, str.begin() + high))
return low;
/* If removing str[high] makes the whole string palindrome
We basically check if substring str[low+1..high] is
palindrome or not. */
if (isPalindrome(str.begin() + low, str.begin() + high - 1))
return high;
return -1;
}
}
// We reach here when complete string will be palindrome
// if complete string is palindrome then return mid character
return -2;
}
// Driver code to test above methods
int main()
{
string str = "abecbea";
int idx = possiblePalinByRemovingOneChar(str);
if (idx == -1)
cout << "Not Possible \n";
else if (idx == -2)
cout << "Possible without removing any character";
else
cout << "Possible by removing character"
<< " at index " << idx << "\n";
return 0;
}
Java
// Java program to check whether
// it is possible to make string
// palindrome by removing one character
import java.util.*;
class GFG
{
// Utility method to check if
// substring from low to high is
// palindrome or not.
static boolean isPalindrome(String str,
int low, int high)
{
while (low < high)
{
if (str.charAt(low) != str.charAt(high))
return false;
low++;
high--;
}
return true;
}
// This method returns -1 if it is
// not possible to make string a palindrome.
// It returns -2 if string is already
// a palindrome. Otherwise it returns
// index of character whose removal can
// make the whole string palindrome.
static int possiblePalinByRemovingOneChar(String str)
{
// Initialize low and right
// by both the ends of the string
int low = 0, high = str.length() - 1;
// loop until low and
// high cross each other
while (low < high)
{
// If both characters are equal then
// move both pointer towards end
if (str.charAt(low) == str.charAt(high))
{
low++;
high--;
}
else
{
/*
* If removing str[low] makes the
* whole string palindrome. We basically
* check if substring str[low+1..high]
* is palindrome or not.
*/
if (isPalindrome(str, low + 1, high))
return low;
/*
* If removing str[high] makes the whole string
* palindrome. We basically check if substring
* str[low+1..high] is palindrome or not.
*/
if (isPalindrome(str, low, high - 1))
return high;
return -1;
}
}
// We reach here when complete string
// will be palindrome if complete string
// is palindrome then return mid character
return -2;
}
// Driver Code
public static void main(String[] args)
{
String str = "abecbea";
int idx = possiblePalinByRemovingOneChar(str);
if (idx == -1)
System.out.println("Not Possible");
else if (idx == -2)
System.out.println("Possible without " +
"removing any character");
else
System.out.println("Possible by removing" +
" character at index " + idx);
}
}
// This code is contributed by
// sanjeev2552
Python3
# Python program to check whether it is possible to make
# string palindrome by removing one character
# Utility method to check if substring from
# low to high is palindrome or not.
def isPalindrome(string: str, low: int, high: int) -> bool:
while low < high:
if string[low] != string[high]:
return False
low += 1
high -= 1
return True
# This method returns -1 if it
# is not possible to make string
# a palindrome. It returns -2 if
# string is already a palindrome.
# Otherwise it returns index of
# character whose removal can
# make the whole string palindrome.
def possiblepalinByRemovingOneChar(string: str) -> int:
# Initialize low and right by
# both the ends of the string
low = 0
high = len(string) - 1
# loop until low and high cross each other
while low < high:
# If both characters are equal then
# move both pointer towards end
if string[low] == string[high]:
low += 1
high -= 1
else:
# If removing str[low] makes the whole string palindrome.
# We basically check if substring str[low+1..high] is
# palindrome or not.
if isPalindrome(string, low + 1, high):
return low
# If removing str[high] makes the whole string palindrome
# We basically check if substring str[low+1..high] is
# palindrome or not
if isPalindrome(string, low, high - 1):
return high
return -1
# We reach here when complete string will be palindrome
# if complete string is palindrome then return mid character
return -2
# Driver Code
if __name__ == "__main__":
string = "abecbea"
idx = possiblepalinByRemovingOneChar(string)
if idx == -1:
print("Not possible")
else if idx == -2:
print("Possible without removing any character")
else:
print("Possible by removing character at index", idx)
# This code is contributed by
# sanjeev2552
C#
// C# program to check whether
// it is possible to make string
// palindrome by removing one character
using System;
class GFG
{
// Utility method to check if
// substring from low to high is
// palindrome or not.
static bool isPalindrome(string str, int low, int high)
{
while (low < high)
{
if (str[low] != str[high])
return false;
low++;
high--;
}
return true;
}
// This method returns -1 if it is
// not possible to make string a palindrome.
// It returns -2 if string is already
// a palindrome. Otherwise it returns
// index of character whose removal can
// make the whole string palindrome.
static int possiblePalinByRemovingOneChar(string str)
{
// Initialize low and right
// by both the ends of the string
int low = 0, high = str.Length - 1;
// loop until low and
// high cross each other
while (low < high)
{
// If both characters are equal then
// move both pointer towards end
if (str[low] == str[high])
{
low++;
high--;
}
else
{
/*
* If removing str[low] makes the
* whole string palindrome. We basically
* check if substring str[low+1..high]
* is palindrome or not.
*/
if (isPalindrome(str, low + 1, high))
return low;
/*
* If removing str[high] makes the whole string
* palindrome. We basically check if substring
* str[low+1..high] is palindrome or not.
*/
if (isPalindrome(str, low, high - 1))
return high;
return -1;
}
}
// We reach here when complete string
// will be palindrome if complete string
// is palindrome then return mid character
return -2;
}
// Driver Code
public static void Main(String[] args)
{
string str = "abecbea";
int idx = possiblePalinByRemovingOneChar(str);
if (idx == -1)
Console.Write("Not Possible");
else if (idx == -2)
Console.Write("Possible without " +
"removing any character");
else
Console.Write("Possible by removing" +
" character at index " + idx);
}
}
// This code is contributed by shivanisinghss2110
JavaScript
<script>
// JavaScript program to check whether
// it is possible to make string
// palindrome by removing one character
// Utility method to check if
// substring from low to high is
// palindrome or not.
function isPalindrome(str, low, high)
{
while (low < high)
{
if (str.charAt(low) != str.charAt(high))
return false;
low++;
high--;
}
return true;
}
// This method returns -1 if it is
// not possible to make string a palindrome.
// It returns -2 if string is already
// a palindrome. Otherwise it returns
// index of character whose removal can
// make the whole string palindrome.
function possiblePalinByRemovingOneChar(str)
{
// Initialize low and right
// by both the ends of the string
var low = 0, high = str.length - 1;
// loop until low and
// high cross each other
while (low < high)
{
// If both characters are equal then
// move both pointer towards end
if (str.charAt(low) == str.charAt(high))
{
low++;
high--;
}
else
{
/*
* If removing str[low] makes the
* whole string palindrome. We basically
* check if substring str[low+1..high]
* is palindrome or not.
*/
if (isPalindrome(str, low + 1, high))
return low;
/*
* If removing str[high] makes the whole string
* palindrome. We basically check if substring
* str[low+1..high] is palindrome or not.
*/
if (isPalindrome(str, low, high - 1))
return high;
return -1;
}
}
// We reach here when complete string
// will be palindrome if complete string
// is palindrome then return mid character
return -2;
}
// Driver Code
var str = "abecbea";
var idx = possiblePalinByRemovingOneChar(str);
if (idx == -1)
document.write("Not Possible");
else if (idx == -2)
document.write("Possible without " +
"removing any character");
else
document.write("Possible by removing" +
" character at index " + idx);
// this code is contributed by shivanisinghss2110
</script>
Time complexity : O(N)
Space Complexity: O(1)
Similar Reads
Palindrome String Coding Problems
A string is called a palindrome if the reverse of the string is the same as the original one.Example: âmadamâ, âracecarâ, â12321â.Palindrome StringProperties of a Palindrome String:A palindrome string has some properties which are mentioned below:A palindrome string has a symmetric structure which m
2 min read
Palindrome String
Given a string s, the task is to check if it is palindrome or not.Example:Input: s = "abba"Output: 1Explanation: s is a palindromeInput: s = "abc" Output: 0Explanation: s is not a palindromeUsing Two-Pointers - O(n) time and O(1) spaceThe idea is to keep two pointers, one at the beginning (left) and
13 min read
Check Palindrome by Different Language
Easy Problems on Palindrome
Sentence Palindrome
Given a sentence s, the task is to check if it is a palindrome sentence or not. A palindrome sentence is a sequence of characters, such as a word, phrase, or series of symbols, that reads the same backward as forward after converting all uppercase letters to lowercase and removing all non-alphanumer
9 min read
Check if actual binary representation of a number is palindrome
Given a non-negative integer n. The problem is to check if binary representation of n is palindrome or not. Note that the actual binary representation of the number is being considered for palindrome checking, no leading 0âs are being considered. Examples : Input : 9 Output : Yes (9)10 = (1001)2 Inp
6 min read
Print longest palindrome word in a sentence
Given a string str, the task is to print longest palindrome word present in the string str.Examples: Input : Madam Arora teaches Malayalam Output: Malayalam Explanation: The string contains three palindrome words (i.e., Madam, Arora, Malayalam) but the length of Malayalam is greater than the other t
14 min read
Count palindrome words in a sentence
Given a string str and the task is to count palindrome words present in the string str. Examples: Input : Madam Arora teaches malayalam Output : 3 The string contains three palindrome words (i.e., Madam, Arora, malayalam) so the count is three. Input : Nitin speaks malayalam Output : 2 The string co
5 min read
Check if characters of a given string can be rearranged to form a palindrome
Given a string, Check if the characters of the given string can be rearranged to form a palindrome. For example characters of "geeksogeeks" can be rearranged to form a palindrome "geeksoskeeg", but characters of "geeksforgeeks" cannot be rearranged to form a palindrome. Recommended PracticeAnagram P
14 min read
Lexicographically first palindromic string
Rearrange the characters of the given string to form a lexicographically first palindromic string. If no such string exists display message "no palindromic string". Examples: Input : malayalam Output : aalmymlaa Input : apple Output : no palindromic string Simple Approach: 1. Sort the string charact
13 min read