🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
一、题目描述
1.1 输入描述
1.2 输出描述
1.3 测试样例
1.3.1 示例 1
1.3.2 示例 2
二、解题思路
三、代码实现
四、时间复杂度
一、题目描述
相对开音节构成的结构是: 辅音 + 元音(aeiou) + 辅音(r除外) + e,常见的单词有bike、cake等。
给定一个字符串,以空格为分隔符,反转每个单词中的字母(若单词中包含如数字等其他非字母时不进行反转)。反转后计算其中含有相对开音节结构的子串个数(连续的子串中部分字符可以重复)。
1.1 输入描述
一行空格分隔单词的字符串,字符串长度 < 10000,字母都是小写字母。
1.2 输出描述
含有相对开音节结构的子串个数。注:个数 < 10000。
1.3 测试样例
1.3.1 示例 1
输入
ekam a ekac
输出
2
说明:字符串反转后为 make a cake 其中make、cake 为相对开音节子串,总是为 2 个,返回 2。
1.3.2 示例 2
输入
!ekam a ekekac
输出
2
说明:反转后为 !ekam a cakeke 因为 !ekam 含有非英文字符所有不能反转,反转后的 cake、keke 都是相对开音节子串,所以返回 2。
二、解题思路
本题比较简单,按照相对开音节的规则查找所有子串即可。步骤如下所示:
(1)首先,将整个字符串按照空格切分为一个个的子串;
(2)判断当前以空格为分隔的子串是否需要翻转,如果符合条件则翻转子串;
(3)然后,判断子串中每四个连续字符连接组成的子串是否符合相对开音节的规则,符合则总数加 1;
(4)比较下一个以空格分隔的子串,直到比较完所有的以空格为分隔出的子串。
三、代码实现
代码实现如下所示。
#include <iostream>
#include <string>
#include <sstream>
#include <stdlib.h>
#include <algorithm>
using namespace std;
bool isVowel(char ch)
{
char vow[] = {'a', 'e', 'i', 'o', 'u'};
for (int i = 0; i < 5; ++i) {
if (vow[i] == ch) {
return true;
}
}
return false;
}
int isVowelStr(string str)
{
if (!isVowel(str[0]) && isVowel(str[1]) && (!isVowel(str[2]) && str[2] != 'r')) {
return 1;
}
return 0;
}
bool isAlph(string str)
{
int n = str.size();
for (int i = 0; i < n; ++i) {
if (!isalpha(str[i])) {
return false;
}
}
return true;
}
int main()
{
string str;
while (getline(cin, str)) {
int num = 0;
stringstream stream(str);
while (getline(stream, str, ' ')) {
int n = str.size();
if (n < 4) {
continue;
}
if (isAlph(str)) {
reverse(str.begin(), str.end());
}
for (int i = 0; i < n - 3; ++i) {
if (str[i + 3] == 'e') {
num += isVowelStr(str.substr(i, 3));
}
}
}
cout<<num<<endl;
}
return 0;
}
四、时间复杂度
时间复杂度:O(n)
在上述代码中,需要遍历字符串查找有多少个字符串符合规则。
🎈 感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章」回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞