824. 山羊拉丁文

824. 山羊拉丁文

“山羊拉丁文”简介

给定一个由空格分割单词的句子 S。每个单词只包含大写或小写字母。

我们要将句子转换为 “Goat Latin”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。

山羊拉丁文的规则如下:

  1. 如果单词以元音开头(a, e, i, o, u),在单词后添加"ma"。
    例如,单词"apple"变为"applema"。

  2. 如果单词以辅音字母开头(即非元音字母),移除第一个字符并将它放到末尾,之后再添加"ma"。
    例如,单词"goat"变为"oatgma"。

  3. 根据单词在句子中的索引,在单词最后添加与索引相同数量的字母’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。

山羊拉丁文

解题思路

山羊拉丁文的转换一共有两种情况,一种首字母是否是元音,另一种是单词在句子中的索引即位置。

  1. 需要一个函数判断首字母的函数judge()(布尔类型)
  2. 需要一个变量记录单词的位置
  3. 当首字母是辅音时,完成将数组中的部分顺序改变
  4. 字符串的插入,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() 算法会从左边选择序列的元素。它的工作机制如图 所示。
Altrotate() 的第一个参数是这个序列的开始迭代器;第二个参数是指向新的第一个元素的迭代器,它必定在序列之内。第三个参数是这个序列的结束迭代器。图 中的示例说明在容器 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 是经过精心设计的,运行效率很高,比水平一般的程序员编写的同类代码速度更快。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值