这一题,简单的字符串处理。只是题目的要求比较麻烦。
题目的大概意思是:给你一段字符串,判断是否可以被接受。
判断的条件为:
1.存在一个元音。(元音有a,e,i,o,u)
2.不能有连续的三个元音或者连续的三个非元音。
3.不能有连续的两个相同字符除了e和o可以之外
有了这些条件,就很容易了。
下面的是一次AC的代码,有详细的注释:
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char str[25];
int tag[25], flag[25]; //tag数组是来判断是否有三个元音连续和非元音连续,flag数组判是否有两个相同字符连续
while(cin >> str)
{
if(strcmp(str, "end") == 0) //结束标记
break;
int len = strlen(str);
memset(tag, 0, sizeof(tag)); //初始化两个数组
memset(flag, 0, sizeof(flag));
for(int i = 0; i < len; i++)
{
if(str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' || str[i] == 'u')
{
tag[i] = 1; //是元音,标记该位置为1;
if(i > 0 && (str[i - 1] == 'a' || str[i - 1] == 'e' || str[i - 1] == 'i'
|| str[i - 1] == 'o' || str[i - 1] == 'u')) //如果它的上一个位置为1,相加起来
{ //最后判断是否有3出现,就可以知道是否有3个元音连续
tag[i] += tag[i - 1];
}
}
else //同理,非元音也是,只是是判-3而已
{
tag[i] = -1;
if(i > 0 && !(str[i - 1] == 'a' || str[i - 1] == 'e' || str[i - 1] == 'i'
|| str[i - 1] == 'o' || str[i - 1] == 'u'))
{
tag[i] += tag[i - 1];
}
}
if(i > 0 && str[i] == str[i - 1] && (str[i] != 'e' && str[i] != 'o')) //判是否有两个相同的连续
flag[i] = 1;
}
int a, b, c, d;
a = b = c = d = 0;
for(int j = 0; j < len; j++)
{
if(tag[j] == 1) //判是否存在元音
a = 1;
if(tag[j] == 3) //判是否存在三个元音连续
b = 1;
if(tag[j] == -3) //判是否存在三个非元音连续
c = 1;
if(flag[j] == 1) //判是否存在两个相同的字符连续,除e和o的
d = 1;
}
if(a == 1 && b == 0 && c == 0 && d == 0)
cout << '<' << str << '>' << " is acceptable." << endl;
else
cout << '<' << str << '>' << " is not acceptable." << endl;
}
return 0;
}杭电ACM1039——Easier Done Than Said?
原文:http://blog.csdn.net/qq_25425023/article/details/45457141