Count of strings whose prefix match with the given string to a given length k
Last Updated :
29 Aug, 2023
Given an array of strings arr[] and given some queries where each query consists of a string str and an integer k. The task is to find the count of strings in arr[] whose prefix of length k matches with the k length prefix of str.
Examples:
Input: arr[] = {"abba", "abbb", "abbc", "abbd", "abaa", "abca"}, str = "abbg", k = 3
Output: 4
"abba", "abbb", "abbc" and "abbd" are the matching strings.
Input: arr[] = {"geeks", "geeksforgeeks", "forgeeks"}, str = "geeks", k = 2
Output: 2
Prerequisite: Trie | (Insert and Search)
Approach: We will form a trie and insert all the strings in the trie and we will create another variable (frequency) for each node which will store the frequency of prefixes of the given strings. Now to get the count of strings whose prefix matches with the given string to a given length k we will have to traverse the trie to the length k from the root, the frequency of the Node will give the count of such strings.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
// Trie node (considering only lowercase alphabets)
struct Node {
Node* arr[26];
int freq;
};
// Function to insert a node in the trie
Node* insert(string s, Node* root)
{
int in;
Node* cur = root;
for (int i = 0; i < s.length(); i++) {
in = s[i] - 'a';
// If there is no node created then create one
if (cur->arr[in] == NULL)
cur->arr[in] = new Node();
// Increase the frequency of the node
cur->arr[in]->freq++;
// Move to the next node
cur = cur->arr[in];
}
// Return the updated root
return root;
}
// Function to return the count of strings
// whose prefix of length k matches with the
// k length prefix of the given string
int find(string s, int k, Node* root)
{
int in, count = 0;
Node* cur = root;
// Traverse the string
for (int i = 0; i < s.length(); i++) {
in = s[i] - 'a';
// If there is no node then return 0
if (cur->arr[in] == NULL)
return 0;
// Else traverse to the required node
cur = cur->arr[in];
count++;
// Return the required count
if (count == k)
return cur->freq;
}
return 0;
}
// Driver code
int main()
{
string arr[] = { "abba", "abbb", "abbc", "abbd", "abaa", "abca" };
int n = sizeof(arr) / sizeof(string);
Node* root = new Node();
// Insert the strings in the trie
for (int i = 0; i < n; i++)
root = insert(arr[i], root);
// Query 1
cout << find("abbg", 3, root) << endl;
// Query 2
cout << find("abg", 2, root) << endl;
// Query 3
cout << find("xyz", 2, root) << endl;
return 0;
}
Java
// Java implementation of the approach
class GFG
{
// Trie node (considering only lowercase alphabets)
static class Node
{
Node[] arr = new Node[26];
int freq;
};
// Function to insert a node in the trie
static Node insert(String s, Node root)
{
int in;
Node cur = root;
for (int i = 0; i < s.length(); i++)
{
in = s.charAt(i) - 'a';
// If there is no node created then create one
if (cur.arr[in] == null)
cur.arr[in] = new Node();
// Increase the frequency of the node
cur.arr[in].freq++;
// Move to the next node
cur = cur.arr[in];
}
// Return the updated root
return root;
}
// Function to return the count of Strings
// whose prefix of length k matches with the
// k length prefix of the given String
static int find(String s, int k, Node root)
{
int in, count = 0;
Node cur = root;
// Traverse the String
for (int i = 0; i < s.length(); i++)
{
in = s.charAt(i) - 'a';
// If there is no node then return 0
if (cur.arr[in] == null)
return 0;
// Else traverse to the required node
cur = cur.arr[in];
count++;
// Return the required count
if (count == k)
return cur.freq;
}
return 0;
}
// Driver code
public static void main(String[] args)
{
String arr[] = { "abba", "abbb", "abbc",
"abbd", "abaa", "abca" };
int n = arr.length;
Node root = new Node();
// Insert the Strings in the trie
for (int i = 0; i < n; i++)
root = insert(arr[i], root);
// Query 1
System.out.print(find("abbg", 3, root) + "\n");
// Query 2
System.out.print(find("abg", 2, root) + "\n");
// Query 3
System.out.print(find("xyz", 2, root) + "\n");
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python3 implementation of the approach
# Trie node (considering only lowercase alphabets)
class Node :
def __init__(self):
self.arr = [None]*26
self.freq = 0
class Trie:
# Trie data structure class
def __init__(self):
self.root = self.getNode()
def getNode(self):
# Returns new trie node (initialized to NULLs)
return Node()
# Function to insert a node in the trie
def insert(self, s):
_in = 0
cur = self.root
for i in range(len(s)):
_in = ord(s[i]) - ord('a')
# If there is no node created then create one
if not cur.arr[_in]:
cur.arr[_in] = self.getNode()
# Increase the frequency of the node
cur.arr[_in].freq += 1
# Move to the next node
cur = cur.arr[_in]
# Function to return the count of strings
# whose prefix of length k matches with the
# k length prefix of the given string
def find(self, s, k):
_in = 0
count = 0
cur = self.root
# Traverse the string
for i in range(len(s)):
_in = ord(s[i]) - ord('a')
# If there is no node then return 0
if cur.arr[_in] == None:
return 0
# Else traverse to the required node
cur = cur.arr[_in]
count += 1
# Return the required count
if count == k:
return cur.freq
return 0
# Driver code
def main():
arr = [ "abba", "abbb", "abbc", "abbd", "abaa", "abca" ]
n = len(arr)
root = Trie();
# Insert the strings in the trie
for i in range(n):
root.insert(arr[i])
# Query 1
print(root.find("abbg", 3))
# Query 2
print(root.find("abg", 2))
# Query 3
print(root.find("xyz", 2))
if __name__ == '__main__':
main()
# This code is contributed by divyamohan123
C#
// C# implementation of the approach
using System;
class GFG
{
// Trie node (considering only lowercase alphabets)
public class Node
{
public Node[] arr = new Node[26];
public int freq;
};
// Function to insert a node in the trie
static Node insert(String s, Node root)
{
int iN;
Node cur = root;
for (int i = 0; i < s.Length; i++)
{
iN = s[i] - 'a';
// If there is no node created then create one
if (cur.arr[iN] == null)
cur.arr[iN] = new Node();
// Increase the frequency of the node
cur.arr[iN].freq++;
// Move to the next node
cur = cur.arr[iN];
}
// Return the updated root
return root;
}
// Function to return the count of Strings
// whose prefix of length k matches with the
// k length prefix of the given String
static int find(String s, int k, Node root)
{
int iN, count = 0;
Node cur = root;
// Traverse the String
for (int i = 0; i < s.Length; i++)
{
iN = s[i] - 'a';
// If there is no node then return 0
if (cur.arr[iN] == null)
return 0;
// Else traverse to the required node
cur = cur.arr[iN];
count++;
// Return the required count
if (count == k)
return cur.freq;
}
return 0;
}
// Driver code
public static void Main(String[] args)
{
String []arr = { "abba", "abbb", "abbc",
"abbd", "abaa", "abca" };
int n = arr.Length;
Node root = new Node();
// Insert the Strings in the trie
for (int i = 0; i < n; i++)
root = insert(arr[i], root);
// Query 1
Console.Write(find("abbg", 3, root) + "\n");
// Query 2
Console.Write(find("abg", 2, root) + "\n");
// Query 3
Console.Write(find("xyz", 2, root) + "\n");
}
}
// This code is contributed by 29AjayKumar
JavaScript
<script>
// JavaScript implementation of the approach
// Trie node (considering only lowercase alphabets)
class Node
{
constructor()
{
this.arr=new Array(26);
this.freq=0;
}
}
// Function to insert a node in the trie
function insert(s,root)
{
let In;
let cur = root;
for (let i = 0; i < s.length; i++)
{
In = s[i].charCodeAt(0) - 'a'.charCodeAt(0);
// If there is no node created then create one
if (cur.arr[In] == null)
cur.arr[In] = new Node();
// Increase the frequency of the node
cur.arr[In].freq++;
// Move to the next node
cur = cur.arr[In];
}
// Return the updated root
return root;
}
// Function to return the count of Strings
// whose prefix of length k matches with the
// k length prefix of the given String
function find(s,k,root)
{
let In, count = 0;
let cur = root;
// Traverse the String
for (let i = 0; i < s.length; i++)
{
In = s[i].charCodeAt(0) - 'a'.charCodeAt(0);
// If there is no node then return 0
if (cur.arr[In] == null)
return 0;
// Else traverse to the required node
cur = cur.arr[In];
count++;
// Return the required count
if (count == k)
return cur.freq;
}
return 0;
}
// Driver code
let arr=["abba", "abbb", "abbc",
"abbd", "abaa", "abca"];
let n = arr.length;
let root = new Node();
// Insert the Strings in the trie
for (let i = 0; i < n; i++)
root = insert(arr[i], root);
// Query 1
document.write(find("abbg", 3, root) + "<br>");
// Query 2
document.write(find("abg", 2, root) + "<br>");
// Query 3
document.write(find("xyz", 2, root) + "<br>");
// This code is contributed by rag2127
</script>
Time Complexity: O(N*M), where N is the size of the array and M is the maximum length of string present in that array.
Auxiliary Space: O(N*M)
Approach without using Trie:
The idea is to use substring of length k. Since we are dealing with prefixes we need to consider the substring of length k starting from index 0. This substring will always be the prefix of the string. Store the k-length substring of str from index 0 in a string a. Run a loop for each word in the string array and for each word which is of length greater than k take the substring of length k starting from index 0. Now check for equality of the two substrings a and b. If the two are equal increase the count. Finally after coming out of the loop return the count.
C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int klengthpref(string arr[], int n, int k, string str)
{
string a = str.substr(
0, k); // storing k-length substring of str
int count
= 0; // counter to count the matching condition
// looping through each word of arr
for (int i = 0; i < n; i++) {
if (arr[i].length()
< k) // if the length of string from arr is
// less than k
continue; // then there is no point in
// finding the substring so we
// skip
string b = arr[i].substr(
0, k); // storing k-length substring of each
// string from arr
if (a == b) // checking equality of the two
// substring a and b
count++; // if condition matches increase
// the counter
}
return count; // finally return the count
}
};
int main()
{
string arr[] = { "abba", "abbb", "abbc",
"abbd", "abaa", "abca" };
string str = "abbg";
int n = sizeof(arr) / sizeof(string), k = 3;
Solution ob;
cout << ob.klengthpref(arr, n, k, str);
return 0;
}
Java
class GFG {
public static void main(String args[])
{
String[] arr = { "abba", "abbb", "abbc",
"abbd", "abaa", "abca" };
String str = "abbg";
int n = arr.length, k = 3;
Solution obj = new Solution();
int ans = obj.klengthpref(arr, n, k, str);
System.out.println(ans);
}
}
class Solution {
public int klengthpref(String[] arr, int n, int k,
String str)
{
String a = str.substring(
0, k); // storing k-length substring of str
int count
= 0; // counter to count the matching condition
// looping through each word of arr
for (int i = 0; i < n; i++) {
if (arr[i].length()
< k) // if the length of string from arr is
// less than k
continue; // then there is no point in
// finding the substring so we
// skip
String b = arr[i].substring(
0, k); // storing k-length substring of each
// string from arr
if (a.equals(b)) // checking equality of the two
// substring a and b
count++; // if condition matches increase
// the counter
}
return count; // finally return the count
}
}
Python3
class Solution:
def klengthpref(self, arr, n, k, s):
a = s[:k] # storing k-length substring of str
count = 0 # counter to count the matching condition
# looping through each word of arr
for i in range(n):
if(len(arr[i]) < k): # if the length of string from arr is less than k
continue # then there is no point in finding the substring so we skip
t = arr[i]
b = t[:k] # storing k-length substring of each string from arr
if(a == b): # checking equality of the two substring a and b
count += 1 # if condition matches increase the counter by 1
return count # finally return the count
arr = ["abba", "abbb", "abbc", "abbd", "abaa", "abca"]
str = "abbg"
n = len(arr)
k = 3
obj = Solution()
print(obj.klengthpref(arr, n, k, str))
C#
using System;
class GFG {
static void Main(string[] args) {
string[] arr = { "abba", "abbb", "abbc", "abbd", "abaa", "abca" };
string str = "abbg";
int n = arr.Length;
int k = 3;
Solution obj = new Solution();
int ans = obj.Klengthpref(arr, n, k, str);
Console.WriteLine(ans);
}
}
class Solution {
public int Klengthpref(string[] arr, int n, int k, string str) {
string a = str.Substring(0, k); // storing k-length substring of str
int count = 0; // counter to count the matching condition
// looping through each word of arr
for (int i = 0; i < n; i++) {
if (arr[i].Length < k) // if the length of string from arr is less than k
continue; // then there is no point in finding the substring so we skip
string b = arr[i].Substring(0, k); // storing k-length substring of each string from arr
if (a.Equals(b)) // checking equality of the two substring a and b
count++; // if condition matches increase the counter
}
return count; // finally return the count
}
}
// This code is contributed by Aman Kumar.
JavaScript
<script>
class Solution {
klengthpref(arr, n, k, str) {
// storing k-length substring of str
let a = str.substr(0, k);
// counter to count the matching condition
let count = 0;
// looping through each word of arr
for (let i = 0; i < n; i++) {
// if the length of string from arr is
// less than k
// then there is no point in
// finding the substring so we
// skip
if (arr[i].length < k) {
continue;
}
// storing k-length substring of each
// string from arr
let b = arr[i].substr(0, k);
// checking equality of the two
// substring a and b
if (a == b) {
// if condition matches increase
// the counter
count++;
}
}
// finally return the count
return count;
}
}
let arr = ["abba", "abbb", "abbc", "abbd", "abaa", "abca"];
let str = "abbg";
let n = arr.length;
let k = 3;
let ob = new Solution();
document.write(ob.klengthpref(arr, n, k, str));
// This code is contributed by Utkarsh Kumar.
</script>
Time Complexity: O(N*M), where N is the size of the array and M is the maximum length of string present in that array.
Auxiliary Space: O(M)
Approach Name: Prefix Match Count
Steps:
- Initialize a variable count to 0 to keep track of the number of strings in arr[] that match the prefix of length k in str.
- Loop through all the strings in arr[].
- Check if the prefix of length k in the current string matches the prefix of length k in str.
- If it does, increment the count variable.
- Return the count variable as the result of the query.
C++
#include <iostream>
#include <string>
#include <vector>
using namespace std;
// Function to count the number of strings in the vector 'arr' that have a matching prefix of length 'k' with the input string 'str'
int PrefixMatchCount(vector<string>& arr, string str, int k) {
int count = 0; // Initialize a variable to store the count of matching strings
for (const string& s : arr) { // Iterate through each string 's' in the vector 'arr' using a range-based for loop
if (s.substr(0, k) == str.substr(0, k)) { // Check if the first 'k' characters of 's' and 'str' are equal
count++; // If there is a match, increment the count variable
}
}
return count; // Return the final count of matching strings
}
int main() {
vector<string> arr = { "abba", "abbb", "abbc", "abbd", "abaa", "abca" }; // Initialize a vector 'arr' containing some strings
string str = "abbg"; // Initialize the input string 'str'
int k = 3; // Initialize the prefix length 'k'
cout << PrefixMatchCount(arr, str, k) << endl; // Call the PrefixMatchCount function and print the result
return 0; // Exit the program with status 0
}
Java
import java.io.*;
class GFG {
public static int prefixMatchCount(String[] arr,
String str, int k)
{
int count = 0;
for (String s : arr) {
if (s.substring(0, k).equals(
str.substring(0, k))) {
count++;
}
}
return count;
}
// Driver Code
public static void main(String[] args)
{
String[] arr = { "abba", "abbb", "abbc",
"abbd", "abaa", "abca" };
String str = "abbg";
int k = 3;
System.out.println(prefixMatchCount(arr, str, k));
}
}
Python3
def prefixMatchCount(arr, str, k):
count = 0
for s in arr:
if s[:k] == str[:k]:
count += 1
return count
arr = ["abba", "abbb", "abbc", "abbd", "abaa", "abca"]
str = "abbg"
k = 3
print(prefixMatchCount(arr, str, k))
C#
using System;
class Program
{
static int PrefixMatchCount(string[] arr, string str, int k)
{
int count = 0;
foreach (string s in arr)
{
if (s.Substring(0, k) == str.Substring(0, k))
{
count++;
}
}
return count;
}
static void Main(string[] args)
{
string[] arr = { "abba", "abbb", "abbc", "abbd", "abaa", "abca" };
string str = "abbg";
int k = 3;
Console.WriteLine(PrefixMatchCount(arr, str, k));
}
}
JavaScript
// Function to count the number of strings in the 'arr' that have a matching prefix of length 'k' with the input string 'str'
function prefixMatchCount(arr, str, k) {
let count = 0;
for (let s of arr) {
if (s.substring(0, k) === str.substring(0, k)) {
count++;
}
}
return count;
}
// Driver code
let arr = ["abba", "abbb", "abbc", "abbd", "abaa", "abca"];
let str = "abbg";
let k = 3;
// Calling the function and printing the result
console.log(prefixMatchCount(arr, str, k));
Time Complexity: O(N*L), where N is the number of strings in arr[] and L is the maximum length of a string in arr[] and str.
Auxiliary Space: O(1)
Similar Reads
Count of isogram strings in given array of strings with length at least K
Given an array arr[] containing N strings and an integer K, the task is to find the number of strings which are isograms and at least of length K. Examples: Input: arr[] = {"abcd", "der", "erty"}, K = 4Output: 2Explanation: All given strings are isograms, but only "abcd" and "erty" are of length at
5 min read
Number of ways to form a given String from the given set of Strings
Given a string str and an array of strings dictionary[], the task is to find the number of ways str can be formed as a concatenation of strings (any number of times) in a dictionary[]. Examples: Input: str = abab, dictionary[] = { a, b, ab }Output: 4Explanation: There are 4 ways to form string str a
15+ min read
Length of longest prefix anagram which are common in given two strings
Given two strings str1 and str2 of the lengths of N and M respectively, the task is to find the length of the longest anagram string that is prefix substring of both strings. Examples: Input: str1 = "abaabcdezzwer", str2 = "caaabbttyh"Output: 6Explanation: Prefixes of length 1 of string str1 and str
8 min read
Count M-length substrings occurring exactly K times in a string
Given a string S of length N and two integers M and K, the task is to count the number of substrings of length M occurring exactly K times in the string S. Examples: Input: S = "abacaba", M = 3, K = 2Output: 1Explanation: All distinct substrings of length 3 are "aba", "bac", "aca", "cab".Out of all
15+ min read
Length of all prefixes that are also the suffixes of given string
Given a string S consisting of N characters, the task is to find the length of all prefixes of the given string S that are also suffixes of the same string S. Examples: Input: S = "ababababab"Output: 2 4 6 8Explanation: The prefixes of S that are also its suffixes are: "ab" of length = 2"abab" of le
10 min read
Count strings that end with the given pattern
Given a pattern pat and a string array sArr[], the task is to count the number of strings from the array that ends with the given pattern. Examples: Input: pat = "ks", sArr[] = {"geeks", "geeksforgeeks", "games", "unit"} Output: 2 Only string "geeks" and "geeksforgeeks" end with the pattern "ks". In
7 min read
Count of substrings that start and end with 1 in given Binary String
Given a binary string, count the number of substrings that start and end with 1. Examples: Input: "00100101"Output: 3Explanation: three substrings are "1001", "100101" and "101" Input: "1001"Output: 1Explanation: one substring "1001" Recommended PracticeCount SubstringsTry It!Count of substrings tha
12 min read
Count of unique Subsequences of given String with lengths in range [0, N]
Given a string S of length N, the task is to find the number of unique subsequences of the string for each length from 0 to N. Note: The uppercase letters and lowercase letters are considered different and the result may be large so print it modulo 1000000007. Examples: Input: S = "ababd"Output: Num
14 min read
Convert to a string that is repetition of a substring of k length
Given a string, find if it is possible to convert it to a string that is the repetition of a substring with k characters. To convert, we can replace one substring of length k starting at index i (zero-based indexing) such that i is divisible by K, with k characters. Examples: Input: str = "bdac", k
7 min read
Count the number of vowels occurring in all the substrings of given string | Set 2
Given a string str[] of length N of lowercase characters containing 0 or more vowels, the task is to find the count of vowels that occurred in all the substrings of the given string. Examples: Input: str = âabcâ Output: 3The given string âabcâ contains only one vowel = âaâ Substrings of âabcâ are =
5 min read