Check if the given string is K-periodic
Given a string str and an integer K, the task is to check whether the given string is K-periodic. A string is k-periodic if the string is a repetition of the sub-string str[0 … k-1] i.e. the string “ababab” is 2-periodic. Print Yes if the given string is k-periodic, else print No.
Examples:
Input: str = “geeksgeeks”, k = 5
Output: Yes
Given string can be generated by repeating the prefix of length k i.e. “geeks”Input: str = “geeksforgeeks”, k = 3
Output: No
Approach: Starting with the sub-string str[k, 2k-1], str[2k, 3k-1] and so on, check whether all of these sub-strings are equal to the prefix of the string of length k i.e. str[0, k-1]. If the condition is true for all such sub-strings, then print Yes else print No.
Below is the implementation of the above approach:
C++
// CPP implementation of the approach #include<bits/stdc++.h> using namespace std; // Function that return true if sub-string // of length k starting at index i is also // a prefix of the string bool isPrefix(string str, int len, int i, int k) { // k length sub-string cannot start at index i if (i + k > len) return false ; for ( int j = 0; j < k; j++) { // Character mismatch between the prefix // and the sub-string starting at index i if (str[i] != str[j]) return false ; i++; } return true ; } // Function that returns true if str is K-periodic bool isKPeriodic(string str, int len, int k) { // Check whether all the sub-strings // str[0, k-1], str[k, 2k-1] ... are equal // to the k length prefix of the string for ( int i = k; i < len; i += k) if (!isPrefix(str, len, i, k)) return false ; return true ; } // Driver code int main() { string str = "geeksgeeks" ; int len = str.length(); int k = 5; if (isKPeriodic(str, len, k)) cout << ( "Yes" ); else cout << ( "No" ); } // This code is contributed by // Surendra_Gangwar |
Java
// Java implementation of the approach class GFG { // Function that return true if sub-string // of length k starting at index i is also // a prefix of the string static boolean isPrefix(String str, int len, int i, int k) { // k length sub-string cannot start at index i if (i + k > len) return false ; for ( int j = 0 ; j < k; j++) { // Character mismatch between the prefix // and the sub-string starting at index i if (str.charAt(i) != str.charAt(j)) return false ; i++; } return true ; } // Function that returns true if str is K-periodic static boolean isKPeriodic(String str, int len, int k) { // Check whether all the sub-strings // str[0, k-1], str[k, 2k-1] ... are equal // to the k length prefix of the string for ( int i = k; i < len; i += k) if (!isPrefix(str, len, i, k)) return false ; return true ; } // Driver code public static void main(String[] args) { String str = "geeksgeeks" ; int len = str.length(); int k = 5 ; if (isKPeriodic(str, len, k)) System.out.print( "Yes" ); else System.out.print( "No" ); } } |
Python3
# Python3 implementation of the approach # Function that returns true if sub-string # of length k starting at index i # is also a prefix of the string def isPrefix(string, length, i, k): # k length sub-string cannot # start at index i if i + k > length: return False for j in range ( 0 , k): # Character mismatch between the prefix # and the sub-string starting at index i if string[i] ! = string[j]: return False i + = 1 return True # Function that returns true if # str is K-periodic def isKPeriodic(string, length, k): # Check whether all the sub-strings # str[0, k-1], str[k, 2k-1] ... are equal # to the k length prefix of the string for i in range (k, length, k): if isPrefix(string, length, i, k) = = False : return False return True # Driver code if __name__ = = "__main__" : string = "geeksgeeks" length = len (string) k = 5 if isKPeriodic(string, length, k) = = True : print ( "Yes" ) else : print ( "No" ) # This code is contributed # by Rituraj Jain |
C#
// C# implementation of the approach using System; class GFG { // Function that return true if sub-string // of length k starting at index i is also // a prefix of the string static bool isPrefix(String str, int len, int i, int k) { // k length sub-string cannot start at index i if (i + k > len) return false ; for ( int j = 0; j < k; j++) { // Character mismatch between the prefix // and the sub-string starting at index i if (str[i] != str[j]) return false ; i++; } return true ; } // Function that returns true if str is K-periodic static bool isKPeriodic(String str, int len, int k) { // Check whether all the sub-strings // str[0, k-1], str[k, 2k-1] ... are equal // to the k length prefix of the string for ( int i = k; i < len; i += k) if (!isPrefix(str, len, i, k)) return false ; return true ; } // Driver code public static void Main() { String str = "geeksgeeks" ; int len = str.Length; int k = 5; if (isKPeriodic(str, len, k)) Console.Write( "Yes" ); else Console.Write( "No" ); } } /* This code contributed by PrinciRaj1992 */ |
PHP
<?php // PHP implementation of the approach // Function that return true if sub- // of length $k starting at index $i // is also a prefix of the string function isPrefix( $str , $len , $i , $k ) { // $k length sub- cannot start at index $i if ( $i + $k > $len ) return false; for ( $j = 0; $j < $k ; $j ++) { // Character mismatch between the prefix // and the sub- starting at index $i if ( $str [ $i ] != $str [ $j ]) return false; $i ++; } return true; } // Function that returns true if $str is K-periodic function isKPeriodic( $str , $len , $k ) { // Check whether all the sub-strings // $str[0, $k-1], $str[$k, 2k-1] ... are equal // to the $k length prefix of the for ( $i = $k ; $i < $len ; $i += $k ) if (!isPrefix( $str , $len , $i , $k )) return false; return true; } // Driver code $str = "geeksgeeks" ; $len = strlen ( $str ); $k = 5; if (isKPeriodic( $str , $len , $k )) echo ( "Yes" ); else echo ( "No" ); // This code is contributed by ihritik ?> |
Javascript
<script> // js implementation of the approach // Function that return true if sub-string // of length k starting at index i is also // a prefix of the string function isPrefix(str, len, i, k){ // k length sub-string cannot start at index i if (i + k > len) return false ; for (let j = 0; j < k; j++) { // Character mismatch between the prefix // and the sub-string starting at index i if (str[i] != str[j]) return false ; i++; } return true ; } // Function that returns true if str is K-periodic function isKPeriodic(str, len, k) { // Check whether all the sub-strings // str[0, k-1], str[k, 2k-1] ... are equal // to the k length prefix of the string for (let i = k; i < len; i += k) if (!isPrefix(str, len, i, k)) return false ; return true ; } // Driver code let str = "geeksgeeks" ; let len = str.length; let k = 5; if (isKPeriodic(str, len, k)) document.write( "Yes" ); else document.write( "No" ); </script> |
Yes
Time Complexity: O(K * log(len))
Auxiliary Space: O(1)
Please Login to comment...