Wednesday, July 3, 2024
HomeData ModellingData Structure & AlgorithmSub-strings of length K containing same character

Sub-strings of length K containing same character

Given a string ‘str’ and an integer ‘k’, the task is to count the number of sub-strings of length ‘k’ which are comprised of the same character. Given string contains only lowercase alphabets.
Examples: 

Input: str = "aaaabbbccdddd", k=4
Output: 2
The sub-strings of length 4 which contain identical 
characters are 'aaaa' and 'dddd'. So, the count is 2.

Input: str = "aaaaaa", k=4
Output: 3

A simple approach: 

  • Find all the sub-strings of the string that are of length ‘k’.
  • Check if those sub-strings are composed of only ‘1’ character.
  • If the above conditions hold then increase the count.
  • Display the count.

Efficient approach: We will use Window sliding technique to solve this problem. 

  • Take a sub-string of length ‘k’ (which is the first ‘k’ characters).
  • Then, add next character to the sub-string.
  • If the length of the sub-string is greater than ‘k’ then remove the character from the beginning of the string.
  • And, count the frequency of the characters in the sub-string with the help of a map.
  • If the frequency of one of the sub-string’s character is equal to length of the sub-string itself i.e. all the characters are same.
  • Then, increase the count else repeat the steps above until the there’s no more character to add in the end.
  • Display the total count in the end.

Below is the implementation of the above approach : 

C++




// C++ implementation of above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function that counts all the
// sub-strings of length 'k'
// which have all identical characters
void solve(string s, int k)
{
    // count of sub-strings, length,
    // initial position of sliding window
    int count = 0, length = 0, pos = 0;
 
    // map to store the frequency of
    // the characters of sub-string
    map<char, int> m;
 
    for (int i = 0; i < s.length(); i++) {
 
        // increase the frequency of the character
        // and length of the sub-string
        m[s[i]]++;
        length++;
 
        // if the length of the sub-string
        // is greater than K
        if (length > k) {
 
            // remove the character from
            // the beginning of sub-string
            m[s[pos++]]--;
            length--;
        }
 
        // if the length of the sub string
        // is equal to k and frequency of one
        // of its characters is equal to the
        // length of the sub-string
        // i.e. all the characters are same
        // increase the count
        if (length == k && m[s[i]] == length)
            count++;
    }
 
    // display the number
    // of valid sub-strings
    cout << count << endl;
}
 
// Driver code
int main()
{
    string s = "aaaabbbccdddd";
    int k = 4;
 
    solve(s, k);
 
    return 0;
}


Java




// Java implementation of above approach
import java.util.*;
 
class GFG
{
    // Function that counts all the
    // sub-strings of length 'k'
    // which have all identical characters
    static void solve(String s, int k)
    {
        // count of sub-strings, length,
        // initial position of sliding window
        int count = 0, length = 0, pos = 0;
     
        // map to store the frequency of
        // the characters of sub-string
        HashMap<Character, Integer> m =
                            new HashMap<Character, Integer>();
     
        for (int i = 0; i < s.length(); i++)
        {
     
            // increase the frequency of the character
            // and length of the sub-string
            if(m.containsKey(s.charAt(i)))
                m.put(s.charAt(i), m.get(s.charAt(i))+1);
            else
                m.put(s.charAt(i), 1);
                 
            length++;
     
            // if the length of the sub-string
            // is greater than K
            if (length > k)
            {
     
                // remove the character from
                // the beginning of sub-string
                m.put(s.charAt(pos), m.get(s.charAt(pos)) -1 );
                pos++;
                length--;
            }
     
            // if the length of the sub string
            // is equal to k and frequency of one
            // of its characters is equal to the
            // length of the sub-string
            // i.e. all the characters are same
            // increase the count
            if (length == k && m.get(s.charAt(i)) == length)
                count++;
        }
     
        // display the number
        // of valid sub-strings
        System.out.println( count);
    }
     
    // Driver code
    public static void main (String[] args)
    {
         
        String s = "aaaabbbccdddd";
        int k = 4;
     
        solve(s, k);
    }
}
 
// This code is contributed by ihritik


Python 3




# Python3 implementation of above
# approach
 
# Function that counts all the
# sub-strings of length 'k'
# which have all identical characters
def solve(s, k) :
 
    # count of sub-strings, length,
    # initial position of sliding window
    count, length, pos = 0, 0, 0
 
    # dictionary to store the frequency of
    # the characters of sub-string
    m = dict.fromkeys(s,0)
 
    for i in range(len(s)) :
         
        # increase the frequency of the character
        # and length of the sub-string
        m[s[i]] += 1
        length += 1
 
        # if the length of the sub-string
        # is greater than K
        if length > k :
 
            # remove the character from
            # the beginning of sub-string
            m[s[pos]] -= 1
            pos += 1
            length -= 1
 
        # if the length of the sub string
        # is equal to k and frequency of one
        # of its characters is equal to the
        # length of the sub-string
        # i.e. all the characters are same
        # increase the count
        if length == k and m[s[i]] == length :
            count += 1
 
    # display the number
    # of valid sub-strings
    print(count)
             
 
 
# Driver code    
if __name__ == "__main__" :
 
    s = "aaaabbbccdddd"
    k = 4
 
    # Function call
    solve(s, k)
                 
# This code is contributed by
# ANKITRAI1


C#




// C# implementation of above approach
 
using System;
using System.Collections.Generic;
class GFG
{
    // Function that counts all the
    // sub-strings of length 'k'
    // which have all identical characters
    static void solve(string s, int k)
    {
        // count of sub-strings, length,
        // initial position of sliding window
        int count = 0, length = 0, pos = 0;
     
        // map to store the frequency of
        // the characters of sub-string
        Dictionary<char, int> m =
                            new Dictionary<char, int>();
     
        for (int i = 0; i < s.Length; i++) {
     
            // increase the frequency of the character
            // and length of the sub-string
            if(m.ContainsKey(s[i]))
                m[s[i]]++;
            else
                m[s[i]] = 1;
                 
            length++;
     
            // if the length of the sub-string
            // is greater than K
            if (length > k) {
     
                // remove the character from
                // the beginning of sub-string
                m[s[pos]]--;
                pos++;
                length--;
            }
     
            // if the length of the sub string
            // is equal to k and frequency of one
            // of its characters is equal to the
            // length of the sub-string
            // i.e. all the characters are same
            // increase the count
            if (length == k && m[s[i]] == length)
                count++;
        }
     
        // display the number
        // of valid sub-strings
        Console.WriteLine(count);
    }
     
    // Driver code
    public static void Main () {
         
        string s = "aaaabbbccdddd";
        int k = 4;
     
        solve(s, k);
     
    }
 
}
 
 
// This code is contributed by ihritik


PHP




<?php
// PHP implementation of above approach
 
// Function that counts all the
// sub-strings of length 'k'
// which have all identical characters
function solve($s, $k)
{
    // count of sub-strings, length,
    // initial position of sliding window
    $count = 0;
    $length = 0;
    $pos = 0;
 
    // map to store the frequency of
    // the characters of sub-string
    $m = array();
 
    for ($i = 0; $i < strlen($s); $i++)
    {
 
        // increase the frequency of the character
        // and length of the sub-string
        $m[$s[$i]]++;
        $length++;
 
        // if the length of the sub-string
        // is greater than K
        if ($length > $k)
        {
 
            // remove the character from
            // the beginning of sub-string
            $m[$s[$pos++]]--;
            $length--;
        }
 
        // if the length of the sub string
        // is equal to k and frequency of one
        // of its characters is equal to the
        // length of the sub-string
        // i.e. all the characters are same
        // increase the count
        if ($length == $k && $m[$s[$i]] == $length)
            $count++;
    }
 
    // display the number
    // of valid sub-strings
    echo $count . "\n";
}
 
// Driver code
$s = "aaaabbbccdddd";
$k = 4;
 
solve($s, $k);
 
// This code is contributed
// by ChitraNayal
?>


Javascript




<script>
 
 
// Javascript implementation of above approach
 
// Function that counts all the
// sub-strings of length 'k'
// which have all identical characters
function solve( s,  k)
{
    // count of sub-strings, length,
    // initial position of sliding window
    var count = 0, length = 0, pos = 0;
 
    // map to store the frequency of
    // the characters of sub-string
    var m = new Map();
 
    for (var i = 0; i < s.length; i++) {
 
        // increase the frequency of the character
        // and length of the sub-string
        if(!m.has(s[i]))
        {
            m.set(s[i], 0);
        }
        m.set(s[i], m.get(s[i])+1);
        length++;
 
        // if the length of the sub-string
        // is greater than K
        if (length > k) {
 
            // remove the character from
            // the beginning of sub-string
            if(!m.has(s[pos]))
            {
                m.set(s[pos], 0);
            }
            m.set(s[pos], m[s[pos]]-1);
            pos+=1;
            length--;
        }
 
        // if the length of the sub string
        // is equal to k and frequency of one
        // of its characters is equal to the
        // length of the sub-string
        // i.e. all the characters are same
        // increase the count
        if (length == k && m.get(s[i]) == length)
            count++;
    }
 
    // display the number
    // of valid sub-strings
    document.write( count);
}
 
// Driver code
var s = "aaaabbbccdddd";
var k = 4;
solve(s, k);
 
 
</script>


Output

2

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Ted Musemwa
As a software developer I’m interested in the intersection of computational thinking and design thinking when solving human problems. As a professional I am guided by the principles of experiential learning; experience, reflect, conceptualise and experiment.
RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments