# 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:
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 substring``int` `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 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``;` `    ``// 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

 ``

Output:

`3`

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.

My Personal Notes arrow_drop_up