给定一个由空格分割单词的句子 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
。
class Solution {
public:
string toGoatLatin(string S)
{
int i=0,s1=S.size(),j=1,count=0;//i表示单词首字母位置,j表示空格位置
set<char>set1{'a','e','i','o','u','A','E','I','O','U'};
string word;//代表取出的每个单词
string result="";
while(i<s1)
{
if(S[j]==' '||S[j]=='\0')//如果碰到空格或者结束符号
{
count++;
word=S.substr(i,j-i);//取出单词,子字符串
if(set1.count(word[0])==0)//首字母非元音
{
word=word.substr(1,word.size()-1)+word[0]+"ma";
}
else//首字母为元音字母
{
word=word+"ma";
}
for(int k=0;k<count;k++) word=word+'a';
result=result+word+' ';//每个单词存储在字符串中,添加一个空格位
i=j+1;//更新i的位置
j=i+1;//更新j的位置
}
else
j++;
}
result=result.substr(0,result.size()-1);//去掉最后一次添加的空格位
return result;
}
};
string.substr(目标字符串的开始位置,结束位置)
此方法是每次提取出一个单词作为一个字符串,处理完之后把他们连接在一起
class Solution {
public:
string toGoatLatin(string S) {
vector<string> strBlock;
string tmp;
int left = 0;
int len = 0;
for(int i=0;i<S.size()+1;i++)
{
if(S[i] == ' '||S[i]=='\0')
{
tmp = S.substr(left,len);
strBlock.push_back(tmp);
left = i+1;
len = -1;
}
len++;
}
S.clear();
for(int i=0;i<strBlock.size();i++)
{
if(isConsonant(strBlock[i][0]))
{
strBlock[i].push_back(strBlock[i][0]); //将第一个复制到最后
S.insert(S.end(),(++strBlock[i].begin()),strBlock[i].end()); //取第二个到最后
}
else
{
S.insert(S.end(),strBlock[i].begin(),strBlock[i].end());
}
S += "ma";
for(int j=0;j<i+1;j++)
S += "a";
S += " ";
}
S.pop_back();
return S;
}
bool isConsonant(char &c)
{
if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u'|| c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U')
return false;
return true;
}
};
此方法是先把字符串转换成vector string。两个算法的性能差不多。