Check if a given string is a rotation of a palindrome
Last Updated :
07 Jul, 2022
Given a string, check if it is a rotation of a palindrome. For example your function should return true for "aab" as it is a rotation of "aba".
Examples:
Input: str = "aaaad"
Output: 1
// "aaaad" is a rotation of a palindrome "aadaa"
Input: str = "abcd"
Output: 0
// "abcd" is not a rotation of any palindrome.
A Simple Solution is to take the input string, try every possible rotation of it and return true if a rotation is a palindrome. If no rotation is palindrome, then return false.
Following is the implementation of this approach.
Implementation:
C++
#include <iostream>
#include <string>
using namespace std;
// A utility function to check if a string str is palindrome
bool isPalindrome(string str)
{
// Start from leftmost and rightmost corners of str
int l = 0;
int h = str.length() - 1;
// Keep comparing characters while they are same
while (h > l)
if (str[l++] != str[h--])
return false;
// If we reach here, then all characters were matching
return true;
}
// Function to check if a given string is a rotation of a
// palindrome.
bool isRotationOfPalindrome(string str)
{
// If string itself is palindrome
if (isPalindrome(str))
return true;
// Now try all rotations one by one
int n = str.length();
for (int i = 0; i < n - 1; i++) {
string str1 = str.substr(i + 1, n - i - 1);
string str2 = str.substr(0, i + 1);
// Check if this rotation is palindrome
if (isPalindrome(str1.append(str2)))
return true;
}
return false;
}
// Driver program to test above function
int main()
{
cout << isRotationOfPalindrome("aab") << endl;
cout << isRotationOfPalindrome("abcde") << endl;
cout << isRotationOfPalindrome("aaaad") << endl;
return 0;
}
Java
// Java program to check if a given string
// is a rotation of a palindrome
import java.io.*;
class Palindrome {
// A utility function to check if a string str is palindrome
static boolean isPalindrome(String str)
{
// Start from leftmost and rightmost corners of str
int l = 0;
int h = str.length() - 1;
// Keep comparing characters while they are same
while (h > l)
if (str.charAt(l++) != str.charAt(h--))
return false;
// If we reach here, then all characters were matching
return true;
}
// Function to check if a given string is a rotation of a
// palindrome
static boolean isRotationOfPalindrome(String str)
{
// If string itself is palindrome
if (isPalindrome(str))
return true;
// Now try all rotations one by one
int n = str.length();
for (int i = 0; i < n - 1; i++) {
String str1 = str.substring(i + 1);
String str2 = str.substring(0, i + 1);
// Check if this rotation is palindrome
if (isPalindrome(str1 + str2))
return true;
}
return false;
}
// driver program
public static void main(String[] args)
{
System.out.println((isRotationOfPalindrome("aab")) ? 1 : 0);
System.out.println((isRotationOfPalindrome("abcde")) ? 1 : 0);
System.out.println((isRotationOfPalindrome("aaaad")) ? 1 : 0);
}
}
// Contributed by Pramod Kumar
Python3
# Python program to check if a given string is a rotation
# of a palindrome
# A utility function to check if a string str is palindrome
def isPalindrome(string):
# Start from leftmost and rightmost corners of str
l = 0
h = len(string) - 1
# Keep comparing characters while they are same
while h > l:
l+= 1
h-= 1
if string[l-1] != string[h + 1]:
return False
# If we reach here, then all characters were matching
return True
# Function to check if a given string is a rotation of a
# palindrome.
def isRotationOfPalindrome(string):
# If string itself is palindrome
if isPalindrome(string):
return True
# Now try all rotations one by one
n = len(string)
for i in range(n-1):
string1 = string[i + 1:n]
string2 = string[0:i + 1]
# Check if this rotation is palindrome
string1+=(string2)
if isPalindrome(string1):
return True
return False
# Driver program
print ("1" if isRotationOfPalindrome("aab") == True else "0")
print ("1" if isRotationOfPalindrome("abcde") == True else "0")
print ("1" if isRotationOfPalindrome("aaaad") == True else "0")
# This code is contributed by BHAVYA JAIN
C#
// C# program to check if a given string
// is a rotation of a palindrome
using System;
class GFG {
// A utility function to check if
// a string str is palindrome
public static bool isPalindrome(string str)
{
// Start from leftmost and
// rightmost corners of str
int l = 0;
int h = str.Length - 1;
// Keep comparing characters
// while they are same
while (h > l) {
if (str[l++] != str[h--]) {
return false;
}
}
// If we reach here, then all
// characters were matching
return true;
}
// Function to check if a given string
// is a rotation of a palindrome
public static bool isRotationOfPalindrome(string str)
{
// If string itself is palindrome
if (isPalindrome(str)) {
return true;
}
// Now try all rotations one by one
int n = str.Length;
for (int i = 0; i < n - 1; i++) {
string str1 = str.Substring(i + 1);
string str2 = str.Substring(0, i + 1);
// Check if this rotation is palindrome
if (isPalindrome(str1 + str2)) {
return true;
}
}
return false;
}
// Driver Code
public static void Main(string[] args)
{
Console.WriteLine((isRotationOfPalindrome("aab")) ? 1 : 0);
Console.WriteLine((isRotationOfPalindrome("abcde")) ? 1 : 0);
Console.WriteLine((isRotationOfPalindrome("aaaad")) ? 1 : 0);
}
}
// This code is contributed by Shrikant13
JavaScript
<script>
// javascript program to check if a given string
// is a rotation of a palindrome
// A utility function to check if
// a string str is palindrome
function isPalindrome( str)
{
// Start from leftmost and
// rightmost corners of str
var l = 0;
var h = str.length - 1;
// Keep comparing characters
// while they are same
while (h > l) {
if (str[l++] != str[h--]) {
return false;
}
}
// If we reach here, then all
// characters were matching
return true;
}
// Function to check if a given string
// is a rotation of a palindrome
function isRotationOfPalindrome( str)
{
// If string itself is palindrome
if (isPalindrome(str)) {
return true;
}
// Now try all rotations one by one
var n = str.length;
for (var i = 0; i < n - 1; i++) {
var str1 = str.substring(i + 1);
var str2 = str.substring(0, i + 1);
// Check if this rotation is palindrome
if (isPalindrome(str1 + str2)) {
return true;
}
}
return false;
}
// Driver Code
document.write((isRotationOfPalindrome("aab")) ? 1 : 0 );
document.write("<br>");
document.write((isRotationOfPalindrome("abcde")) ? 1 : 0 );
document.write("<br>");
document.write((isRotationOfPalindrome("aaaad")) ? 1 : 0);
// This code is contributed by bunnyram19.
</script>
Time Complexity: O(n2)
Auxiliary Space: O(n) for storing rotations.
Note that the above algorithm can be optimized to work in O(1) extra space as we can rotate a string in O(n) time and O(1) extra space.
An Optimized Solution can work in O(n) time. The idea here is to use Manacher's algorithm to solve the above problem.
- Let the given string be 's' and length of string be 'n'.
- Preprocess/Prepare the string to use Manachers Algorithm, to help find even length palindrome, for which we concatenate the given string with itself (to find if rotation will give a palindrome) and add '$' symbol at the beginning and '#' characters between letters. We end the string using '@'. So for 'aaad' input the reformed string will be - '$#a#a#a#a#d#a#a#a#a#d#@'
- Now the problem reduces to finding Longest Palindromic Substring using Manacher's algorithm of length n or greater in the string.
- If there is palindromic substring of length n, then return true, else return false. If we find a palindrome of greater length then we check if the size of our input is even or odd, correspondingly our palindrome length found should also be even or odd.
For eg. if our input size is 3 and while performing Manacher's Algorithm we get a palindrome size of 5 it obviously would contain a substring of size of 3 which is a palindrome but the same cannot be said for a palindrome of length of 4. Hence we check if both the size of the input and the size of palindrome found at any instance is both even or both odd.
Boundary case would be a word with same letters that would defy the above property but for that case our algorithm will find both even length and odd length palindrome one of them being a substring, hence it wont be a problem.
Below is the implementation of the above algorithm:
C++
// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
// Function to check if we have found
// a palindrome of same length as the input
// which is a rotation of the input string
bool checkPal(int x, int len)
{
if (x == len)
return true;
else if (x > len) {
if ((x % 2 == 0 && len % 2 == 0)
|| (x % 2 != 0 && len % 2 != 0))
return true;
}
return false;
}
// Function to preprocess the string
// for Manacher's Algorithm
string reform(string s)
{
string s1 = "$#";
// Adding # between the characters
for (int i = 0; i < s.size(); i++) {
s1 += s[i];
s1 += '#';
}
s1 += '@';
return s1;
}
// Function to find the longest palindromic
// substring using Manacher's Algorithm
bool longestPal(string s, int len)
{
// Current Left Position
int mirror = 0;
// Center Right Position
int R = 0;
// Center Position
int C = 0;
// LPS Length Array
int P[s.size()] = { 0 };
int x = 0;
// Get currentLeftPosition Mirror
// for currentRightPosition i
for (int i = 1; i < s.size() - 1; i++) {
mirror = 2 * C - i;
// If currentRightPosition i is
// within centerRightPosition R
if (i < R)
P[i] = min((R - i), P[mirror]);
// Attempt to expand palindrome centered
// at currentRightPosition i
while (s[i + (1 + P[i])] == s[i - (1 + P[i])]) {
P[i]++;
}
// Check for palindrome
bool ans = checkPal(P[i], len);
if (ans)
return true;
// If palindrome centered at currentRightPosition i
// expand beyond centerRightPosition R,
// adjust centerPosition C based on expanded palindrome
if (i + P[i] > R) {
C = i;
R = i + P[i];
}
}
return false;
}
// Driver code
int main()
{
string s = "aaaad";
int len = s.size();
s += s;
s = reform(s);
cout << longestPal(s, len);
return 0;
}
// This code is contributed by Vindusha Pankajakshan
Java
// Java implementation of the approach
import java.util.*;
class GFG
{
// Function to check if we have found
// a palindrome of same length as the input
// which is a rotation of the input string
static boolean checkPal(int x, int len)
{
if (x == len)
{
return true;
}
else if (x > len)
{
if ((x % 2 == 0 && len % 2 == 0) ||
(x % 2 != 0 && len % 2 != 0))
{
return true;
}
}
return false;
}
// Function to preprocess the string
// for Manacher's Algorithm
static String reform(String s)
{
String s1 = "$#";
// Adding # between the characters
for (int i = 0; i < s.length(); i++)
{
s1 += s.charAt(i);
s1 += '#';
}
s1 += '@';
return s1;
}
// Function to find the longest palindromic
// substring using Manacher's Algorithm
static boolean longestPal(String s, int len)
{
// Current Left Position
int mirror = 0;
// Center Right Position
int R = 0;
// Center Position
int C = 0;
// LPS Length Array
int[] P = new int[s.length()];
int x = 0;
// Get currentLeftPosition Mirror
// for currentRightPosition i
for (int i = 1; i < s.length() - 1; i++)
{
mirror = 2 * C - i;
// If currentRightPosition i is
// within centerRightPosition R
if (i < R)
{
P[i] = Math.min((R - i), P[mirror]);
}
// Attempt to expand palindrome centered
// at currentRightPosition i
while (s.charAt(i + (1 + P[i])) ==
s.charAt(i - (1 + P[i])))
{
P[i]++;
}
// Check for palindrome
boolean ans = checkPal(P[i], len);
if (ans)
{
return true;
}
// If palindrome centered at currentRightPosition i
// expand beyond centerRightPosition R,
// adjust centerPosition C based on expanded palindrome
if (i + P[i] > R)
{
C = i;
R = i + P[i];
}
}
return false;
}
// Driver code
public static void main(String[] args)
{
String s = "aaaad";
int len = s.length();
s += s;
s = reform(s);
System.out.println(longestPal(s, len) ? 1 : 0);
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python implementation of the approach
# Function to check if we have found
# a palindrome of same length as the input
# which is a rotation of the input string
def checkPal (x, Len):
if (x == Len):
return True
elif (x > Len):
if ((x % 2 == 0 and Len % 2 == 0) or (x % 2 != 0 and Len % 2 != 0)):
return True
return False
# Function to preprocess the string
# for Manacher's Algorithm
def reform (s):
s1 = "$#"
# Adding '#' between the characters
for i in range(len(s)):
s1 += s[i]
s1 += "#"
s1 += "@"
return s1
# Function to find the longest palindromic
# substring using Manacher's Algorithm
def longestPal (s, Len):
# Current Left Position
mirror = 0
# Center Right Position
R = 0
# Center Position
C = 0
# LPS Length Array
P = [0] * len(s)
x = 0
# Get currentLeftPosition Mirror
# for currentRightPosition i
for i in range(1, len(s) - 1):
mirror = 2 * C - i
# If currentRightPosition i is
# within centerRightPosition R
if (i < R):
P[i] = min((R-i), P[mirror])
# Attempt to expand palindrome centered
# at currentRightPosition i
while (s[i + (1 + P[i])] == s[i - (1 + P[i])]):
P[i] += 1
# Check for palindrome
ans = checkPal(P[i], Len)
if (ans):
return True
# If palindrome centered at current
# RightPosition i expand beyond
# centerRightPosition R, adjust centerPosition
# C based on expanded palindrome
if (i + P[i] > R):
C = i
R = i + P[i]
return False
# Driver Code
if __name__ == '__main__':
s = "aaaad"
Len = len(s)
s += s
s = reform(s)
print(longestPal(s, Len))
# This code is contributed by himanshu77
C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
class GFG
{
// Function to check if we have found
// a palindrome of same length as the input
// which is a rotation of the input string
static bool checkPal(int x, int len)
{
if (x == len)
{
return true;
}
else if (x > len)
{
if ((x % 2 == 0 && len % 2 == 0) ||
(x % 2 != 0 && len % 2 != 0))
{
return true;
}
}
return false;
}
// Function to preprocess the string
// for Manacher's Algorithm
static String reform(String s)
{
String s1 = "$#";
// Adding # between the characters
for (int i = 0; i < s.Length; i++)
{
s1 += s[i];
s1 += '#';
}
s1 += '@';
return s1;
}
// Function to find the longest palindromic
// substring using Manacher's Algorithm
static bool longestPal(String s, int len)
{
// Current Left Position
int mirror = 0;
// Center Right Position
int R = 0;
// Center Position
int C = 0;
// LPS Length Array
int[] P = new int[s.Length];
int x = 0;
// Get currentLeftPosition Mirror
// for currentRightPosition i
for (int i = 1; i < s.Length - 1; i++)
{
mirror = 2 * C - i;
// If currentRightPosition i is
// within centerRightPosition R
if (i < R)
{
P[i] = Math.Min((R - i), P[mirror]);
}
// Attempt to expand palindrome centered
// at currentRightPosition i
while (s[i + (1 + P[i])] == s[i - (1 + P[i])])
{
P[i]++;
}
// Check for palindrome
bool ans = checkPal(P[i], len);
if (ans)
{
return true;
}
// If palindrome centered at currentRightPosition i
// expand beyond centerRightPosition R,
// adjust centerPosition C based on expanded palindrome
if (i + P[i] > R)
{
C = i;
R = i + P[i];
}
}
return false;
}
// Driver code
public static void Main(String[] args)
{
String s = "aaaad";
int len = s.Length;
s += s;
s = reform(s);
Console.WriteLine(longestPal(s, len) ? 1 : 0);
}
}
// This code is contributed by Rajput-Ji
JavaScript
<script>
// javascript implementation of the approach
// Function to check if we have found
// a palindrome of same length as the input
// which is a rotation of the input string
function checkPal(x , len) {
if (x == len) {
return true;
} else if (x > len) {
if ((x % 2 == 0 && len % 2 == 0) ||
(x % 2 != 0 && len % 2 != 0))
{
return true;
}
}
return false;
}
// Function to preprocess the string
// for Manacher's Algorithm
function reform( s) {
var s1 = "$#";
// Adding # between the characters
for (i = 0; i < s.length; i++) {
s1 += s.charAt(i);
s1 += '#';
}
s1 += '@';
return s1;
}
// Function to find the longest palindromic
// substring using Manacher's Algorithm
function longestPal( s , len) {
// Current Left Position
var mirror = 0;
// Center Right Position
var R = 0;
// Center Position
var C = 0;
// LPS Length Array
var P = Array(s.length).fill(0);
var x = 0;
// Get currentLeftPosition Mirror
// for currentRightPosition i
for (i = 1; i < s.length - 1; i++) {
mirror = 2 * C - i;
// If currentRightPosition i is
// within centerRightPosition R
if (i < R) {
P[i] = Math.min((R - i), P[mirror]);
}
// Attempt to expand palindrome centered
// at currentRightPosition i
while (s.charAt(i + (1 + P[i])) == s.charAt(i - (1 + P[i]))) {
P[i]++;
}
// Check for palindrome
var ans = checkPal(P[i], len);
if (ans) {
return true;
}
// If palindrome centered at currentRightPosition i
// expand beyond centerRightPosition R,
// adjust centerPosition C based on expanded palindrome
if (i + P[i] > R) {
C = i;
R = i + P[i];
}
}
return false;
}
// Driver code
var s = "aaaad";
var len = s.length;
s += s;
s = reform(s);
document.write(longestPal(s, len) ? 1 : 0);
// This code is contributed by umadevi9616
</script>
Time Complexity : O(n2)
Auxiliary Space: O(n)
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