leetcode_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

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。两个算法的性能差不多。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值