题目链接:https://leetcode-cn.com/problems/goat-latin/description/
给定一个由空格分割单词的句子
S
。每个单词只包含大写或小写字母。我们要将句子转换为 “Goat Latin”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。
山羊拉丁文的规则如下:
- 如果单词以元音开头(a, e, i, o, u),在单词后添加
"ma"
。
例如,单词"apple"
变为"applema"
。- 如果单词以辅音字母开头(即非元音字母),移除第一个字符并将它放到末尾,之后再添加
"ma"
。
例如,单词"goat"
变为"oatgma"
。- 根据单词在句子中的索引,在单词最后添加与索引相同数量的字母
'a'
,索引从1开始。
例如,在第一个单词后添加"a"
,在第二个单词后添加"aa"
,以此类推。返回将
S
转换为山羊拉丁文后的句子。
示例 1:
输入: "I speak Goat Latin" 输出: "Imaa peaksmaaa oatGmaaaa atinLmaaaaa"
示例 2:
输入: "The quick brown fox jumped over the lazy dog" 输出: "heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"
说明:
S
中仅包含大小写字母和空格。单词间有且仅有一个空格。1 <= S.length <= 150
。
C 代码:
int vowels(char ch)
{
return (ch == 'a'||ch == 'e'||ch == 'i'||ch == 'o'||ch == 'u'||ch == 'A'||ch == 'E'||ch == 'I'||ch == 'O'||ch == 'U');
}
void strcat_ss(char* target,char* first,char* end) //逐个单词strcpy到动态内存里;
{
//char* tar = target;
while(*target)
target++;
while (first < end)
{
*target = *first;
first++;
target++;
}
*target = '\0';
}
char* strcat_s(char *str1, char *str2)
{
if (str1==NULL)
return str2;
else if (str2==NULL)
return str1;
else if(str1==NULL && str2==NULL)
return NULL;
strcat_ss(str1,str2,str2+strlen(str2));
return str1;
}
void exchange(char* pt1,char* pt2) //若不为元音,调到后面;
{
char temp = *pt1;
while (pt1 < pt2)
{
*pt1 = *(pt1+1);
pt1++;
}
*pt2 = temp;
}
char* toGoatLatin(char* S)
{
char* fun = (char *)malloc(2000);
memset(fun,0,2000*sizeof(char));
//char* fun = (char*)calloc(2000,sizeof(char));
char* afun = fun;
char* pt = S;
char* tr = S;
char* addon = "ma";
int n = 0;
while (*tr)
{
if (*tr == ' ')
{
tr++;
pt = tr;
}
while (*tr && *tr != ' ')
tr++;
n++; //n 第几个单词;
if (!vowels(*pt))
exchange(pt, tr-1);
strcat_ss(fun, pt, tr);
strcat_s(afun,addon);
while(*afun != '\0')
afun++;
for(int i = 1;i <= n;i++,afun++)
*afun = 'a';
if (*tr != '\0')
*afun = ' ';
}
return fun;
}
C++代码:
class Solution {
public:
string toGoatLatin(string S) {
string str;
int i,j;
int n = 1; //第几个单词
for (i = 0,j = 0;i < S.size()+1; i++)
{
if (S[i] == ' ' || i == S.size())
{
cout << i << " ";
if (!judge(S[j]) ) { //判断单词的首个字符是否为元音
rotate(S.begin() + j, S.begin() + j +1, S.begin() + i); // ratate循环左移一位
}
str.append(S.begin() + j,S.begin() + i);
str.append("ma");
str.append(n,'a');
if (i != S.size()) str.append(" ");
n++;
j = i + 1;
}
}
return str;
}
bool judge(char ch)
{
return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' ||
ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U';
}
};
谢谢。