给我们一个字符串str []作为输入。目的是计算str []中存在的字谜子串的数量。如果两个字符串包含相同数量的字符并且所有字符都出现在两个字符中,则它们是彼此的字谜。字符的顺序可以不同。
“ abc”是“ cba”,“ bca”等的类似物。
让我们通过示例来理解。
输入− str [] =“ abccb”
输出-整个字谜子串的计数为-4
说明-字谜是-(b,b),(c,c),(bc,cb),(bcc,ccb)
输入-str =“ aaa”
输出-整个字谜子串的计数为-4
说明-字谜是-(a,a),(a,a),(a,a),(aa,aa)
我们正在制作一张映射,其中包含向量,子字符串中包含英语字母的频率,数组中包含此类子字符串的计数。在map <vector <int>中,int> mp_vec; vector <int> vec(MAX,0)将在当前子字符串中存储所有26个字母的频率。映射的整数将是具有相同频率向量的此类子字符串的计数。对于每个子字符串,如果字谜的计数为x,则为x。然后,整个字谜对将为x *(x-1)/ 2。
将字符串str []作为字符数组。
函数anagram_substring(string str,int length)获取字符串并返回总字谜子字符串的计数。
将初始计数设为0。
拿一张映射map <vector <int>,int> mp_vec;
使用两个从i = 0到i <length和j = i到j <length的for循环遍历str []。
对于每个子字符串str [i至j]。vector <int> vec(MAX,0); 将包含其中的英文字母计数。
将c中的当前字符作为str [j]。将其整数值乘以temp = c-'a'。
通过vec [temp] ++更新频率。
使用mp_vec [vec] ++增加与此频率向量相对应的计数。
现在遍历包含所有频率向量和聚合子字符串计数的映射,并使用for循环从迭代器it = mp_vec.begin()到!= mp_vec.end()。
对于每个计数为->秒,请添加((last)*(last-1))/ 2以计算所有成对的字谜
最后,我们将计算所有字谜。
返回计数作为结果。
#include <bits/stdc++.h> using namespace std; #define MAX 26 int anagram_substring(string str, int length){ int count = 0; map<vector<int>, int> mp_vec; for (int i=0; i<length; i++){ vector<int> vec(MAX, 0); for (int j=i; j<length; j++){ char c = str[j]; char temp = c - 'a'; vec[temp]++; mp_vec[vec]++; } } for (auto it = mp_vec.begin(); it != mp_vec.end(); it++){ int last = it->second; count += ((last) * (last-1))/2; } return count; } int main(){ string str = "TP"; int length = str.length(); cout<<"Count of total anagram substrings are: "<<anagram_substring(str, length) << endl; return 0; }
输出结果
如果我们运行上面的代码,它将生成以下输出-
Count of total anagram substrings are: 3