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

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


Python 3

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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

chevron_right


PHP

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

Output:

2


My Personal Notes arrow_drop_up