Minimum length of substring whose rotation generates a palindromic substring
Last Updated :
16 Jun, 2022
Given a string str, the task is to find the minimum length of substring required to rotate that generates a palindromic substring from the given string.
Examples:
Input: str = "abcbd"
Output: 0
Explanation: No palindromic substring can be generated. There is no repeated character in the string.
Input: str = "abcdeba"
Output: 3
Explanation: Rotate substring "deb" to convert the given string to abcbeda with a palindromic substring "bcb".
Approach:
- If no character repeats in the string, then no palindromic substring can be generated.
- For every repeating character, check if the index of its previous occurrence is within one or two indices from the current index. If so, then a palindromic substring already exists.
- Otherwise, calculate the length of (current index - index of the previous occurrence - 1).
- Return the minimum of all such lengths as the answer
Below is the implementation of the above approach:
C++
// C++ Program to find the minimum
// length of substring whose rotation
// generates a palindromic substring
#include <bits/stdc++.h>
using namespace std;
// Function to return the
// minimum length of substring
int count_min_length(string s)
{
// Store the index of
// previous occurrence
// of the character
int hash[26];
// Variable to store
// the maximum length
// of substring
int ans = INT_MAX;
for (int i = 0; i < 26; i++)
hash[i] = -1;
for (int i = 0; i < s.size(); i++) {
// If the current character
// hasn't appeared yet
if (hash[s[i] - 'a'] == -1)
hash[s[i] - 'a'] = i;
else {
// If the character has occurred
// within one or two previous
// index, a palindromic substring
// already exists
if (hash[s[i] - 'a'] == i - 1
|| hash[s[i] - 'a'] == i - 2)
return 0;
// Update the maximum
ans = min(ans,
i - hash[s[i] - 'a'] - 1);
// Replace the previous
// index of the character by
// the current index
hash[s[i] - 'a'] = i;
}
}
// If character appeared
// at least twice
if (ans == INT_MAX)
return -1;
return ans;
}
// Driver Code
int main()
{
string str = "abcdeba";
cout << count_min_length(str);
}
Java
// Java Program to find the minimum
// length of substring whose rotation
// generates a palindromic substring
import java.util.*;
import java.lang.*;
class GFG{
// Function to return the
// minimum length of substring
static int count_min_length(String s)
{
// Store the index of
// previous occurrence
// of the character
int[] hash = new int[26];
// Variable to store
// the maximum length
// of substring
int ans = Integer.MAX_VALUE;
for (int i = 0; i < 26; i++)
hash[i] = -1;
for (int i = 0; i < s.length(); i++)
{
// If the current character
// hasn't appeared yet
if (hash[s.charAt(i) - 'a'] == -1)
hash[s.charAt(i) - 'a'] = i;
else
{
// If the character has occurred
// within one or two previous
// index, a palindromic substring
// already exists
if (hash[s.charAt(i) - 'a'] == i - 1 ||
hash[s.charAt(i) - 'a'] == i - 2)
return 0;
// Update the maximum
ans = Math.min(ans,
i - hash[s.charAt(i) - 'a'] - 1);
// Replace the previous
// index of the character by
// the current index
hash[s.charAt(i) - 'a'] = i;
}
}
// If character appeared
// at least twice
if (ans == Integer.MAX_VALUE)
return -1;
return ans;
}
// Driver code
public static void main(String[] args)
{
String str = "abcdeba";
System.out.println(count_min_length(str));
}
}
// This code is contributed by offbeat
Python3
# Python3 program to find the minimum
# length of substring whose rotation
# generates a palindromic substring
import sys
INT_MAX = sys.maxsize;
# Function to return the
# minimum length of substring
def count_min_length(s):
# Store the index of
# previous occurrence
# of the character
hash = [0] * 26;
# Variable to store
# the maximum length
# of substring
ans = sys.maxsize;
for i in range(26):
hash[i] = -1;
for i in range(len(s)):
# If the current character
# hasn't appeared yet
if (hash[ord(s[i]) - ord('a')] == -1):
hash[ord(s[i]) - ord('a')] = i;
else :
# If the character has occurred
# within one or two previous
# index, a palindromic substring
# already exists
if (hash[ord(s[i]) - ord('a')] == i - 1 or
hash[ord(s[i]) - ord('a')] == i - 2) :
return 0;
# Update the maximum
ans = min(ans, i - hash[ord(s[i]) -
ord('a')] - 1);
# Replace the previous
# index of the character by
# the current index
hash[ord(s[i]) - ord('a')] = i;
# If character appeared
# at least twice
if (ans == INT_MAX):
return -1;
return ans;
# Driver Code
if __name__ == "__main__":
string = "abcdeba";
print(count_min_length(string));
# This code is contributed by AnkitRai01
C#
// C# Program to find the minimum
// length of substring whose rotation
// generates a palindromic substring
using System;
class GFG{
// Function to return the
// minimum length of substring
static int count_min_length(string s)
{
// Store the index of
// previous occurrence
// of the character
int[] hash = new int[26];
// Variable to store
// the maximum length
// of substring
int ans = int.MaxValue;
for (int i = 0; i < 26; i++)
hash[i] = -1;
for (int i = 0; i < s.Length; i++)
{
// If the current character
// hasn't appeared yet
if (hash[s[i] - 'a'] == -1)
hash[s[i] - 'a'] = i;
else
{
// If the character has occurred
// within one or two previous
// index, a palindromic substring
// already exists
if (hash[s[i] - 'a'] == i - 1 ||
hash[s[i] - 'a'] == i - 2)
return 0;
// Update the maximum
ans = Math.Min(ans,
i - hash[s[i] - 'a'] - 1);
// Replace the previous
// index of the character by
// the current index
hash[s[i] - 'a'] = i;
}
}
// If character appeared
// at least twice
if (ans == int.MaxValue)
return -1;
return ans;
}
// Driver code
public static void Main(string[] args)
{
string str = "abcdeba";
Console.WriteLine(count_min_length(str));
}
}
// This code is contributed by AnkitRai01
JavaScript
<script>
// JavaScript Program to find the minimum
// length of substring whose rotation
// generates a palindromic substring
// Function to return the
// minimum length of substring
function count_min_length(s) {
// Store the index of
// previous occurrence
// of the character
var hash = new Array(26).fill(0);
// Variable to store
// the maximum length
// of substring
var ans = 2147483648;
for (var i = 0; i < 26; i++)
hash[i] = -1;
for (var i = 0; i < s.length; i++) {
// If the current character
// hasn't appeared yet
if (hash[s[i].charCodeAt(0) - "a".charCodeAt(0)] == -1)
hash[s[i].charCodeAt(0) - "a".charCodeAt(0)] = i;
else {
// If the character has occurred
// within one or two previous
// index, a palindromic substring
// already exists
if (
hash[s[i].charCodeAt(0) - "a".charCodeAt(0)] == i - 1 ||
hash[s[i].charCodeAt(0) - "a".charCodeAt(0)] == i - 2
)
return 0;
// Update the maximum
ans = Math.min(
ans,
i - hash[s[i].charCodeAt(0) - "a".charCodeAt(0)] - 1
);
// Replace the previous
// index of the character by
// the current index
hash[s[i].charCodeAt(0) - "a".charCodeAt(0)] = i;
}
}
// If character appeared
// at least twice
if (ans === 2147483648) return -1;
return ans;
}
// Driver code
var str = "abcdeba";
document.write(count_min_length(str));
</script>
Time Complexity: O(N), as we are using a loop to traverse N times so it will cost us O(N) time
Auxiliary Space: O(26), as we are using extra space for hash.
Similar Reads
Maximum even length sub-string that is permutation of a palindrome Given string str , the task is to find the maximum length of the sub-string of str that can be arranged into a Palindrome (i.e at least one of its permutation is a Palindrome). Note that the sub-string must be of even length. Examples: Input: str = "124565463" Output: 6 "456546" is the valid sub-str
9 min read
Minimum steps to delete a string after repeated deletion of palindrome substrings Given a string str, containing only digits from '0' to '9'. Your task is to find the minimum number of operations required to delete all the digits of string, where in each operation we can delete a palindromic substring.Note: After deleting the substring, the remaining parts are concatenated.Exampl
15+ min read
Minimum size substring to be removed to make a given string palindromic Given a string S, the task is to print the string after removing the minimum size substring such that S is a palindrome or not. Examples: Input: S = "pqrstsuvwrqp"Output: pqrstsrqpExplanation:Removal of the substring "uvw" modifies S to a palindromic string. Input: S = "geeksforskeeg"Output: geeksfs
15+ min read
Permutation of given string that maximizes count of Palindromic substrings Given a string S, the task is to find the permutation of the string such that palindromic substrings in the string are maximum.Note: There can be multiple answers for each string. Examples: Input: S = "abcb" Output: "abbc" Explanation: "abbc" is the string with maximum number of palindromic substrin
3 min read
Generate a String of having N*N distinct non-palindromic Substrings Given an even integer N, the task is to construct a string such that the total number of distinct substrings of that string that are not a palindrome equals N2. Examples: Input: N = 2 Output: aabb Explanation: All the distinct non-palindromic substrings are ab, abb, aab and aabb. Therefore, the coun
3 min read