Counts of distinct consecutive sub-string of length two using C++ STL
Last Updated :
28 Jun, 2021
Given a string the task is to print all distinct sub-strings of length two in the given string. All substrings should be printed in lexicographical order.
Examples:
Input: str = "abcab"
Output: ab-2
bc-1
ca-1
Input: str = "xyz"
Output: xy-1
yz-1
The idea of this article is to demonstrate map and pair in C++ STL.
We declare a map d_pairs that uses a character pair key and count as value. We iterate over the given string from the starting index to store every consecutive pair if not present already and increment its count in the map. After completion of the loop, we get all distinct consecutive pairs and their corresponding occurrence count in the map container.
Please note that map is used as we need output in sorted order. We could use a unordered_map() if output was not needed in sorted order. Time complexity of underdered_map() operations is O(1) while that of map is O(Log n)
CPP
#include<bits/stdc++.h>
using namespace std;
void printDistinctSubStrs(string str)
{
map<pair< char , char >, int > dPairs;
for ( int i=0; i<str.size()-1; i++)
dPairs[make_pair(str[i], str[i+1])]++;
cout << "Distinct sub-strings with counts:\n" ;
for ( auto it=dPairs.begin(); it!=dPairs.end(); it++)
cout << it->first.first << it->first.second
<< "-" << it->second << " " ;
}
int main()
{
string str = "abcacdcacabacaassddssklac" ;
printDistinctSubStrs(str);
return 0;
}
|
Output:
Distinct sub-strings with counts:
aa-1 ab-2 ac-4 as-1 ba-1 bc-1 ca-4 cd-1 dc-1 dd-1 ds-1 kl-1 la-1 sd-1 sk-1 ss-2
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...