相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外)+e
常见的单词有bike cake
给定一个字符串,以空格为分隔符
反转每个单词的字母
若单词中包含如数字等其他非字母时不进行反转
反转后计算其中含有相对开音节结构的子串个数
(连续子串中部分字符可以重复)
输入描述
字符串 以空格分割的多个单词
长度<10000 字母只考虑小写
输出描述
含有相对开音节结构的子串个数
示例1:
输入
ekam a ekac
输出
2
说明:
反转后为 make a cake 其中make和cake为相对开音节子串
返回2
示例2:
输入
!ekam a ekekac
输出
2
说明
反转后为 !ekam a cakeke
因为!ekam含有非英文字母,所以未反转
其中 cake和keke 为相对开音节子串 返回2
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAX_LEN 1000
#define MAX_NUM 50
typedef struct {
char str[50];
} StrData;
int IsWord(char *s)
{
int i = 0;
while (s[i] != '\0') {
if (s[i] > 'z' || s[i] < 'a') {
return -1;
}
i++;
}
return 1;
}
void StrSwap(char *s)
{
int i, idx;
int len = strlen(s);
char tmp[50] = {0};
len = strlen(s);
if ((len == 1) || (IsWord(s) == -1)) {
return;
}
strcpy(tmp, s);
idx = 0;
for (i = len - 1; i >= 0; i--) {
s[idx] = tmp[i];
idx++;
}
return;
}
// 辅音+元音(aeiou)+辅音(r除外)+e
int GetYuanyinNum(char *s)
{
int i, j;
int count;
int len = strlen(s);
char tmp[5] = {0};
if (len < 4) {
return 0;
}
count = 0;
for (i = 0; i <= len - 4; i++) {
strncpy(tmp, s + i, 4);
//printf("tmp[%s]\n", tmp);
if ((tmp[0] != 'a' && tmp[0] != 'e' && tmp[0] != 'i' && tmp[0] != 'o' && tmp[0] != 'u') &&
(tmp[1] == 'a' || tmp[1] == 'e' || tmp[1] == 'i' || tmp[1] == 'o' || tmp[1] == 'u') &&
(tmp[2] != 'a' && tmp[2] != 'e' && tmp[2] != 'i' && tmp[2] != 'o' && tmp[2] != 'u' && tmp[2] != 'r') &&
(tmp[3] == 'e')) {
count++;
}
}
return count;
}
int GetKaiyuanNum(StrData *data, int len)
{
int i;
int sum = 0;
int num;
for (i = 0; i < len; i++) {
printf("=====str[%s]\n", data[i].str);
num = GetYuanyinNum(data[i].str);
printf("num=%d\n", num);
sum += num;
}
printf("sum=%d\n", sum);
return sum;
}
int main()
{
char s[MAX_LEN] = {0};
StrData data[MAX_NUM] = {0};
int idx;
gets(s);
idx = 0;
char *p = strtok(s, " ");
while (p != NULL) {
sprintf(data[idx].str, "%s", p);
StrSwap(data[idx].str);
idx++;
p = strtok(NULL, " ");
}
GetKaiyuanNum(data, idx);
return 0;
}