Minimum length of substring whose rotation generates a palindromic substring

• Last Updated : 03 Jun, 2021

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:
Explanation: No palindromic substring can be generated. There is no repeated character in the string.

Input: str = “abcdeba”
Output:
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 using namespace std; // Function to return the// minimum length of substringint count_min_length(string s){     // Store the index of    // previous occurrence    // of the character    int hash;     // 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 occured            // 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 Codeint main(){    string str = "abcdeba";    cout << count_min_length(str);}

Java

 // Java Program to find the minimum// length of substring whose rotation// generates a palindromic substringimport java.util.*;import java.lang.*;class GFG{ // Function to return the// minimum length of substringstatic int count_min_length(String s){     // Store the index of    // previous occurrence    // of the character    int[] hash = new int;     // 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 occured            // 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 codepublic 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 substringimport sys INT_MAX = sys.maxsize; # Function to return the# minimum length of substringdef count_min_length(s):     # Store the index of    # previous occurrence    # of the character    hash =  * 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 occured            # 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 Codeif __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 substringusing System;class GFG{ // Function to return the// minimum length of substringstatic int count_min_length(string s){     // Store the index of    // previous occurrence    // of the character    int[] hash = new int;     // 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 occured            // 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 codepublic static void Main(string[] args){    string str = "abcdeba";     Console.WriteLine(count_min_length(str));}} // This code is contributed by AnkitRai01

Javascript


Output:
3

Time Complexity: O(N)

My Personal Notes arrow_drop_up