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. 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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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");
    }
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 */

chevron_right


PHP

$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 ?>

Output:

Yes


My Personal Notes arrow_drop_up

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.