1. 程式人生 > >leetcode 824. 山羊拉丁文(Goat Latin)

leetcode 824. 山羊拉丁文(Goat Latin)

aaaaaa nbma dog 移除 大小寫 分割 space dma bool

目錄

  • 題目描述:
  • 示例 1:
  • 示例 2:
  • 解法:

題目描述:

給定一個由空格分割單詞的句子 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 convert(const string& s, const vector<bool>& flag, const string& pst){
        string res = "";
        if(flag[s[0]]){
            res = s + "ma" + pst;
        }else{
            res = s.substr(1) + s[0] + "ma" + pst;
        }
        return res;
    }
    
    string toGoatLatin(string S) {
        int sz = S.size();
        string pst = "a";
        vector<bool> flag(128, false);
        string vowels = "aeiouAEIOU";
        for(char ch : vowels){
            flag[ch] = true;
        }
        int i = 0, j = 0;
        string res = "";
        while(i < sz){
            while(j < sz && S[j] != ' '){
                j++;
            }
            if(i == j){
                // is whitespace
                res += ' ';
                j++;
            }else{
                res += convert(S.substr(i, j - i), flag, pst);
                pst += 'a';
            }
            i = j;
        }
        return res;
    }
};

leetcode 824. 山羊拉丁文(Goat Latin)