Check if any permutation of string is a K times repeated string
Given a string S and an integer K, the task is to check that if any permutation of the string can be formed by K times repeating any other string.
Examples:
Input: S = “abba”, K = 2
Output: Yes
Explanation:
Permutations of given string –
{“aabb”, “abab”, “abba”, “baab”, “baba”, “bbaa”}
As “abab” is repeating string of “ab”+”ab” = “abab”, which is also permutation of string.
Input: S = “abcabd”, K = 2
Output: No
Explanation:
There is no such repeating string in all permutations of the given string.
Approach 1: The idea is to find the frequency of each character of the string and check that the frequency of the character is a multiple of the given integer K. If the frequency of all characters of the string is divisible by K, then there is a string which is a permutation of the given string and also a K times repeated string.
Below is the implementation of the above approach:
C++
// C++ implementation to check that // the permutation of the given string // is K times repeated string #include <bits/stdc++.h> using namespace std; // Function to check that permutation // of the given string is a // K times repeating String bool repeatingString(string s, int n, int k) { // if length of string is // not divisible by K if (n % k != 0) { return false ; } // Frequency Array int frequency[123]; // Initially frequency of each // character is 0 for ( int i = 0; i < 123; i++) { frequency[i] = 0; } // Computing the frequency of // each character in the string for ( int i = 0; i < n; i++) { frequency[s[i]]++; } int repeat = n / k; // Loop to check that frequency of // every character of the string // is divisible by K for ( int i = 0; i < 123; i++) { if (frequency[i] % repeat != 0) { return false ; } } return true ; } // Driver Code int main() { string s = "abcdcba" ; int n = s.size(); int k = 3; if (repeatingString(s, n, k)) { cout << "Yes" << endl; } else { cout << "No" << endl; } return 0; } |
Java
// Java implementation to check that // the permutation of the given String // is K times repeated String class GFG{ // Function to check that permutation // of the given String is a // K times repeating String static boolean repeatingString(String s, int n, int k) { // if length of String is // not divisible by K if (n % k != 0 ) { return false ; } // Frequency Array int []frequency = new int [ 123 ]; // Initially frequency of each // character is 0 for ( int i = 0 ; i < 123 ; i++) { frequency[i] = 0 ; } // Computing the frequency of // each character in the String for ( int i = 0 ; i < n; i++) { frequency[s.charAt(i)]++; } int repeat = n / k; // Loop to check that frequency of // every character of the String // is divisible by K for ( int i = 0 ; i < 123 ; i++) { if (frequency[i] % repeat != 0 ) { return false ; } } return true ; } // Driver Code public static void main(String[] args) { String s = "abcdcba" ; int n = s.length(); int k = 3 ; if (repeatingString(s, n, k)) { System.out.print( "Yes" + "\n" ); } else { System.out.print( "No" + "\n" ); } } } // This code is contributed by PrinciRaj1992 |
Python3
# Python3 implementation to check that # the permutation of the given string # is K times repeated string # Function to check that permutation # of the given string is a # K times repeating String def repeatingString(s, n, k): # If length of string is # not divisible by K if (n % k ! = 0 ): return False # Frequency Array frequency = [ 0 for i in range ( 123 )] # Initially frequency of each # character is 0 for i in range ( 123 ): frequency[i] = 0 # Computing the frequency of # each character in the string for i in range (n): frequency[s[i]] + = 1 repeat = n / / k # Loop to check that frequency of # every character of the string # is divisible by K for i in range ( 123 ): if (frequency[i] % repeat ! = 0 ): return False return True # Driver Code if __name__ = = '__main__' : s = "abcdcba" n = len (s) k = 3 if (repeatingString(s, n, k)): print ( "Yes" ) else : print ( "No" ) # This code is contributed by Samarth |
C#
// C# implementation to check that // the permutation of the given String // is K times repeated String using System; class GFG{ // Function to check that permutation // of the given String is a // K times repeating String static bool repeatingString(String s, int n, int k) { // if length of String is // not divisible by K if (n % k != 0) { return false ; } // Frequency Array int []frequency = new int [123]; // Initially frequency of each // character is 0 for ( int i = 0; i < 123; i++) { frequency[i] = 0; } // Computing the frequency of // each character in the String for ( int i = 0; i < n; i++) { frequency[s[i]]++; } int repeat = n / k; // Loop to check that frequency of // every character of the String // is divisible by K for ( int i = 0; i < 123; i++) { if (frequency[i] % repeat != 0) { return false ; } } return true ; } // Driver Code public static void Main(String[] args) { String s = "abcdcba" ; int n = s.Length; int k = 3; if (repeatingString(s, n, k)) { Console.Write( "Yes" + "\n" ); } else { Console.Write( "No" + "\n" ); } } } // This code is contributed by Rajput-Ji |
Javascript
<script> // JavaScript implementation to check that // the permutation of the given string // is K times repeated string // Function to check that permutation // of the given string is a // K times repeating String function repeatingString( s, n, k) { // if length of string is // not divisible by K if (n % k != 0) { return false ; } // Frequency Array var frequency = new Array(123); // Initially frequency of each // character is 0 for (let i = 0; i < 123; i++) { frequency[i] = 0; } // Computing the frequency of // each character in the string for (let i = 0; i < n; i++) { frequency[s[i]]++; } var repeat = n / k; // Loop to check that frequency of // every character of the string // is divisible by K for (let i = 0; i < 123; i++) { if (frequency[i] % repeat != 0) { return false ; } } return true ; } // Driver Code var s = "abcdcba" ; var n = s.length; var k = 3; if (repeatingString(s, n, k)) { console.log( "Yes" ); } else { console.log( "No" ); } // This code is contributed by ukasp. </script> |
No
Performance Analysis:
Time Complexity O(N)
Auxiliary Space: O(1)
Approach 2 :
We can check for all possible substrings of the given string and then check if any of these substrings can be repeated K times to form a permutation of the original string.
- For each substring of length l = n/K, we can check if all characters in the substring have the same frequency (count) in the original string S. If this condition is not satisfied, we move to the next substring.
- We repeat step 1 for all substrings of length l in the original string S. If we find any substring which satisfies the condition, we return “Yes”, else we return “No”.
Below is the code for above approach :
C++
#include <bits/stdc++.h> using namespace std; // Function to check if a repeating substring of given length // exists in the given string bool isRepeatingSubstring(string s, int len) { int n = s.length(); // Check if given substring length is greater than string length if (len >= n) { return false ; } // Map to store the frequency of characters unordered_map< char , int > freq; // Find the frequency of characters in first len characters of the string for ( int i = 0; i < len; i++) { freq[s[i]]++; } // Check if the substring consisting of first len characters is repeating bool repeating = true ; for ( auto it : freq) { if (it.second != n/len) { repeating = false ; break ; } } // If the substring is not repeating, check for other substrings if (!repeating) { for ( int i = len; i < n; i++) { // Update the frequency map freq[s[i-len]]--; freq[s[i]]++; // Check if the substring consisting of previous len characters is repeating if (freq[s[i-len]] == 0) { freq.erase(s[i-len]); } if (freq.size() == 1 && freq.begin()->second == n/len) { return true ; } } } return false ; } // Driver code int main() { string S = "abba" ; int K = 2; if (isRepeatingSubstring(S, K)) { cout << "Yes" << endl; } else { cout << "No" << endl; } return 0; } |
Output :
Yes
Time Complexity : O(n^2)
Auxiliary Space : O(1)
Please Login to comment...