C# · 12月 20, 2021

leetcode824.山羊拉丁文(Goat Latin)C C++

题目链接: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 = ”;

}

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,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 != ”)

afun++;

for(int i = 1;i <= n;i++,afun++)

*afun = ‘a’;

if (*tr != ”)

*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’;

}

};

谢谢。