Table of Contents
Problem Statement
In the “Convert a String that is Repetition of a Substring of Length K” problem we have given a string “s” and an integer “k”. Write a program to check whether is it possible to convert it to a string that is the repetition of a substring with k characters.
Input Format
The first line containing a string “s”.
The second line containing an integer value “k”.
Output Format
Print “YES” if it is possible to convert it to a string that is the repetition of a substring with k characters. Otherwise, print “NO”.
Constraints
- 1<=|s|<=10^6
- s[i] must be a lower case English alphabet
Example
abcdefabc 3
YES
Explanation: Here we can replace “def” with “abc”. Then our updated string s is “abcabcabc”. Now, we can easily see if we concatenate abc three times then we get this string.
acdaacda 2
NO
Explanation: There is no substring of length 2, that can we replaced and formed a string such that we get it by concatenation of substring of length k.
Algorithm
1. Traverse the string and Build a map that contains the frequency of substrings(0 to k-1, k to 2k-1, 2k to 3k-1 and so on) of length k.maps strings of length k.
2. If there are only two different substrings of length k and the count of one of the sub string is 1, then print “YES”.
3. Otherwise print “NO”.
Implementation
C++ program to Convert a String that is Repetition of a Substring of Length K
#include<bits/stdc++.h> using namespace std; int main() { string s; cin>>s; int k; cin>>k; int n=s.length(); if(n%k!=0) { cout<<"NO"<<endl; } else { unordered_map<string, int> m; for (int i=0; i<n; i+=k) { m[s.substr(i, k)]++; } if(m.size()==1) { cout<<"YES"<<endl; } else if(m.size()==2) { if(m.begin()->second==1 || m.begin()->second==(n/k-1)) { cout<<"YES"<<endl; } else { cout<<"NO"<<endl; } } else { cout<<"NO"<<endl; } } return 0; }
Java program to Convert a String that is Repetition of a Substring of Length K
import java.util.HashMap; import java.util.Map; import java.util.Scanner; class sum { public static void main(String[] args) { Scanner sr = new Scanner(System.in); String s = sr.next(); int k = sr.nextInt(); int n=s.length(); if(n%k!=0) { System.out.println("NO"); } else { HashMap<String, Integer> m = new HashMap<>(); for(int i=0;i<n;i+=k) { String x = s.substring(i,i+k); int temp = m.get(s.substring(i,i+k))==null? 0 : m.get(s.substring(i,i+k)); m.put(s.substring(i,i+k), temp+1); } if(m.size()==1) { System.out.println("YES"); } else if(m.size()==2) { int flag=0; for(Map.Entry<String, Integer> e : m.entrySet()) { if(e.getValue()==1) { flag=1; break; } } if(flag==0) { System.out.println("NO"); } else { System.out.println("YES"); } } else { System.out.println("NO"); } } } }
abcdabab
YES
Complexity Analysis to Convert a String that is Repetition of a Substring of Length K
Time Complexity
O(n) where n is the size of the given string “s”. Here we simply form substring(0 to k-1, k to 2k-1, 2k to 3k-1 and so on) ok k length and count their frequency by using hash map. Here we do this in linear time.
Space Complexity
O(n) where n is the size of the given string “s”. Here we use hash map for storing the count of the substring of length k.