824. 山羊拉丁文
“山羊拉丁文”简介
给定一个由空格分割单词的句子 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。
解题思路
山羊拉丁文的转换一共有两种情况,一种首字母是否是元音,另一种是单词在句子中的索引即位置。
- 需要一个函数判断首字母的函数
judge()
(布尔类型) - 需要一个变量记录单词的位置
- 当首字母是辅音时,完成将数组中的部分顺序改变
- 字符串的插入,append()函数
judge()函数
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';
}
};
rotate函数()
rotate() 算法会从左边选择序列的元素。它的工作机制如图 所示。
rotate() 的第一个参数是这个序列的开始迭代器;第二个参数是指向新的第一个元素的迭代器,它必定在序列之内。第三个参数是这个序列的结束迭代器。图 中的示例说明在容器 ns 上的旋转操作使值为 4 的元素成为新的第一个元素,最后一个元素的值为 3。元素的圆形序列会被维持,因此可以有效地旋转元素环,直到新的第一个元素成为序列的开始。这个算法会返回一个迭代器,它指向原始的第一个元素所在的新位置。
在这道题中
rotate(S.begin() + j, S.begin() + j + 1, S.begin() + i)
S.begin()指向vector起始位置迭代器
i
表示每次查找时的单词的尾端即以空格结尾的位置
j
表示每次查找时的单词的前段端 每次更新时i+1
S.end() 当前vector末尾元素的下一位置的迭代器
实现了向左循环移一位。
append()函数
append函数是向string的后面追加字符或字符串。
代码实现
#include<iostream>
#include<string>
using namespace std;
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())//单个单词和句子结束的判断
{
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");//无论元音还是辅音都需要增设‘ma’
str.append(n, 'a');//根据单词位置在单词后添加‘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';
}
};
int main() {
Solution s;
string m;
cout << s.toGoatLatin("The quick brown fox jumped over the lazy dog");
system("pause");
return 0;
}
补充:
C++ 的标准模板库(Standard Template Library,STL)是泛型程序设计最成功应用的实例。STL是一些常用数据结构(如链表、可变长数组、排序二叉树)和算法(如排序、查找)的模板的集合,主要由 Alex Stepanov 主持开发,于 1998 年被加入 C++ 标准。
有了 STL,程序员就不必编写大多数常用的数据结构和算法。而且 STL 是经过精心设计的,运行效率很高,比水平一般的程序员编写的同类代码速度更快。