Skip to content
Related Articles

Related Articles

Check if the given string is K-periodic

Improve Article
Save Article
  • Difficulty Level : Easy
  • Last Updated : 02 Aug, 2021
Improve Article
Save Article

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>

Output: 

Yes

 

Time Complexity: O(K * log(len))
Auxiliary Space: O(1)


My Personal Notes arrow_drop_up
Related Articles

Start Your Coding Journey Now!