LeetCode-824. Goat Latin(字串分割)

kewlgrl發表於2018-05-03

824 山羊拉丁文


S給出一個句子,由用空格分隔的單片語成。每個單詞只包含小寫字母和大寫字母。

我們想將句子轉換成“ 山羊拉丁語”  (一種類似於拉丁語的化妝語言)。

山羊拉丁文規則如下:

  • 如果一個單詞以母音開頭(a,e,i,o或u),則追加"ma" 到單詞的末尾。
    例如,'apple'這個詞變成'applema'。
     
  • 如果一個詞以子音開頭(即不是母音),刪除第一個字母並將其附加到最後,然後新增"ma"
    例如,這個詞"goat" 變成了"oatgma"
     
  • 'a' 在每個單詞的末尾新增一個字母,每個單詞的索引在句子中,從1開始。
    例如,第一個單詞被"a"新增到結尾,第二個單詞被"aa"新增到結尾,依此類推。

返回代表從S Goat Latin 轉換的最後一句。 


Example 1:

Input: "I speak Goat Latin"
Output: "Imaa peaksmaaa oatGmaaaa atinLmaaaaa"

Example 2:

Input: "The quick brown fox jumped over the lazy dog"
Output: "heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"

 

Notes:

  • S contains only uppercase, lowercase and spaces. Exactly one space between each word.
  • 1 <= S.length <= 150.

主要是分割字串的兩種方法:

方法一:

C++引入了ostringstream、istringstream、stringstream這三個類,要使用他們建立物件就必須包含<sstream>這個標頭檔案。

             istringstream類用於執行C++風格的串流的輸入操作。

                ostringstream類用於執行C風格的串流的輸出操作。

                strstream類同時可以支援C風格的串流的輸入輸出操作。

                istringstream的建構函式原形如下:

                istringstream::istringstream(string str);

                它的作用是從string物件str中讀取字元。

               

 #include<iostream>

                #include<sstream>

                using namespace std;

                int main()

                {

                string str, line;

                while(getline(cin, line))

                {

                    istringstream stream(line);

                    while(stream>>str)

                    cout<<str.c_str()<<endl;

                }

                return 0;

                }

                測試:

                Input:

                Abdc Xcs  Xa Xa

                Output:

                Abdc

                Xcs

                Xa

AC程式碼:
#include<bits/stdc++.h>
using namespace std;
/********************提交程式碼********************/
class Solution
{
public:
    string toGoatLatin(string S)
    {
        vector<string> ve;
        string str,s,a="a",ans="";
        ve.clear();
        istringstream stream(S);
        bool flag=false;
        while(stream>>str)
        {
            s=str.c_str();
            if(s[0]=='a'||s[0]=='e'||s[0]=='i'||s[0]=='o'||s[0]=='u'||s[0]=='A'||s[0]=='E'||s[0]=='I'||s[0]=='O'||s[0]=='U')
                s+="ma";
            else
            {
                s+=s[0];
                s.erase(0,1);
                s+="ma";
            }
            s+=a;
            a+="a";
            if(!flag)//first one
                flag=true;
            else
                ans+=" ";
            ans+=s;
        }
        return ans;
    }
};
/***************************************************/
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("F:/cb/read.txt","r",stdin);
    //freopen("F:/cb/out.txt","w",stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    string line;
    while(getline(cin,line))
    {
        Solution s;
        cout<<"/"<<s.toGoatLatin(line)<<"/"<<endl;;
    }
    return 0;
}

方法二:

char *strtok(char s[], const char *delim);

引數分別是,“待分割的字串”,“分隔符”

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    char sentence[]="This is a sentence with 7 tokens";
    char *tokenPtr=strtok(sentence," ");
    while(tokenPtr!=NULL) 
    {
        cout<<tokenPtr<<endl;
        tokenPtr=strtok(NULL," ");
    }
    return 0;
}

AC程式碼:
#include<bits/stdc++.h>
using namespace std;
/********************提交程式碼********************/
class Solution
{
public:
    string toGoatLatin(string S)
    {
        string s,a="a",ans="";
        int len=S.length();
        char str[len];
        strcpy(str,S.c_str());
        char*temp = strtok(str," ");
        bool flag=false;
        while(temp)
        {
            s=temp;
            if(s[0]=='a'||s[0]=='e'||s[0]=='i'||s[0]=='o'||s[0]=='u'||s[0]=='A'||s[0]=='E'||s[0]=='I'||s[0]=='O'||s[0]=='U')
                s+="ma";
            else
            {
                s+=s[0];
                s.erase(0,1);
                s+="ma";
            }
            s+=a;
            a+="a";
            if(!flag)//first one
                flag=true;
            else
                ans+=" ";
            ans+=s;
            temp=strtok(NULL," ");
        }
        return ans;
    }
};
/***************************************************/
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("F:/cb/read.txt","r",stdin);
    //freopen("F:/cb/out.txt","w",stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    string line;
    while(getline(cin,line))
    {
        Solution s;
        cout<<"/"<<s.toGoatLatin(line)<<"/"<<endl;;
    }
    return 0;
}


相關文章