一、题目
给定一个由空格分割单词的句子 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++代码实现
class Solution {
public:
string toGoatLatin(string S)
{
vector<string> nums;
S += " "; //将原字符串S最后加一个空格
string temp = ""; //定义一个字符串,用来存每个单词
for(int i = 0;i<S.size();i++) //遍历S字符串
{
if(S[i] != ' ') //如果没有遇到空格
temp += S[i];
else //遇到了空格
{
nums.push_back(temp); //将单词存入nums中
temp = "";
}
}
for(int i = 0;i<nums.size();i++) //遍历nums中的每个单词,根据山羊拉丁文规则进行判断修改单词
{
if(nums[i][0]=='a' || nums[i][0]=='e' || nums[i][0]=='i' || nums[i][0]=='o' || nums[i][0]=='u' || nums[i][0]=='A' || nums[i][0]=='E' || nums[i][0]=='I' || nums[i][0]=='O' || nums[i][0]=='U')
{
nums[i] = nums[i] + "ma"; //将ma加在单词后
for(int j = 0;j<i+1;j++) //再在单词后面加i+1个a
{
nums[i] += "a";
}
}
else //非元音字母开头
{
int temp1 = nums[i][0]; //记录第一个字母
for(int j = 0;j<nums[i].size()-1;j++) //将单词中每个字母(从第二个开始)向前移动一位
{
nums[i][j]=nums[i][j+1];
}
nums[i][nums[i].size()-1]=temp1; //将第一个字母放在单词最后
nums[i] = nums[i] + "ma";
for(int j = 0;j<i+1;j++)
{
nums[i] += "a";
}
}
}
string word_result = ""; //存最后结果的字符串
for(int i = 0;i<nums.size();i++)
{
word_result += nums[i] +" "; //每个单词后加一个空格依次放到字符串word_result中,这样最后就会多一个空格
}
int count = word_result.size()-1; //填充完毕后的word_result字符串长度减一
word_result.resize(count); //改变word_result的大小(去掉最后一个空格)
return word_result;
}
};