给定一个包含英文字母的字符串str。目的是找到在str的所有子串中出现的元音数量。如果字符串为“ abcde”,则子字符串为“ a”,“ b”,“ c”,“ d”,“ e”,“ ab”,“ bc”,“ cd”,“ de”,“ abc”, “ bcd”,“ cde”,“ abcd”,“ bcde”,“ abcde”。这些子字符串中的元音数量为10。(a和e)
例如
str = ”aloe”输出结果
计算在给定字符串的所有子字符串中出现的元音数量: 14
The substrings are: “a”, “l”, “o”, “e”, “al”, “lo”, “oe”, “alo”, “loe”, “aloe”. Total vowels in these are: 14
str=”http”输出结果
计算在给定字符串的所有子字符串中出现的元音数量: 0
The substrings are: “h”, “t”, “t”, “p”, “ht”, “tt”, “tp”, “htt”, “ttp”, “http”. Total vowels in these are: 0
以下程序中使用的方法如下-
在这种方法中,我们将创建一个向量vec,该向量存储vec [i]中所有子字符串中第i个字符的出现次数。
第0个字符出现在n个子字符串中,其中n是字符串str的长度。
第ith个字符出现在所有包含该字符的子字符串(n-i)+包含第ith个字符的子字符串数目以及前一个字符(arr [i-1])-仅由前一个字符形成的子字符串数目(i)。
以字符串str作为输入。
功能 substring_vowels_count(string str, int length) 以str的长度为单位,并返回在给定字符串的所有子字符串中出现的元音数量的计数。
将初始计数设为0。
取整数向量vec。
使用从i−0到i <length的for循环遍历vec,并在str的所有子字符串中用第i个位置字符的出现次数填充它。
如果i = 0,对于第0个字符,此计数为长度。使用push_back [length]设置vec [0] = length。
对于使用push_back(temp_1 + temp_2)设置的所有其他字符,其中temp_1 = length-1和temp_2 = vec [i-1] -i。
现在,再次使用for循环遍历str,并将每个str [i]作为元音(a,e,i,o或u)遍历。添加vec [i]进行计数。
最后,我们将以总数为单位在子字符串中出现元音的总数。
返回计数作为结果。
#include <bits/stdc++.h> using namespace std; int substring_vowels_count(string str, int length){ int count = 0; vector<int> vec; for (int i = 0; i < length; i++){ if (i == 0){ vec.push_back(length); } else { int temp_1 = length − i; int temp_2 = vec[i − 1] − i; vec.push_back(temp_1 + temp_2); } } for (int i = 0; i < length; i++){ if(str[i] == 'a' || str[i] == 'i' || str[i] == 'e' || str[i] == 'o' || str[i] == 'u'){ count = count + vec[i]; } } return count; } int main(){ string str = "honesty"; int length = str.length(); cout<<"计算在给定字符串的所有子字符串中出现的元音数量: "<<substring_vowels_count(str, length); return 0; }输出结果
如果我们运行上面的代码,它将生成以下输出-
计算在给定字符串的所有子字符串中出现的元音数量: 28