题目链接:https://leetcode-cn.com/problems/goat-latin/de ion/

给定一个由空格分割单词的句子 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

C 代码:

int vowels(char ch)
{
   return (ch == \'a\'||ch == \'e\'||ch == \'i\'||ch == \'o\'||ch == \'u\'||ch == \'A\'||ch == \'E\'||ch == \'I\'||ch == \'O\'||ch == \'U\');
}
void strcat_ss(char* target,char* first,char* end)     //逐个单词strcpy到动态内存里;
{
    //char* tar = target;
    while(*target)
        target++;
    while (first < end)
    {
        *target = *first;
        first++;
        target++;
    }
    *target = \'\\0\';
}
char* strcat_s(char *str1, char *str2)
{
    if (str1==NULL)
        return str2;
    else if (str2==NULL)
        return str1;
    else if(str1==NULL && str2==NULL)
        return  NULL;
    
    strcat_ss(str1,str2,str2+strlen(str2));
    return str1;
}
void exchange(char* pt1,char* pt2)     //若不为元音,调到后面;
{
    char temp = *pt1;
    while (pt1 < pt2)
    {
        *pt1 = *(pt1+1);
        pt1++;
    }
    *pt2 = temp;
}
char* toGoatLatin(char* S)
{
    char* fun = (char *)malloc(2000);
    memset(fun,0,2000*sizeof(char));
    //char* fun = (char*)calloc(2000,sizeof(char));
    char* afun = fun;
    char* pt = S;
    char* tr = S;
    char* addon = \"ma\";
    int n = 0;
    while (*tr)
    {
        if (*tr == \' \')
        {
            tr++;
            pt = tr;
        }
        while (*tr && *tr != \' \')
            tr++;
        
        n++;            //n 第几个单词;
        
        if (!vowels(*pt))
            exchange(pt, tr-1);
        strcat_ss(fun, pt, tr);
        strcat_s(afun,addon);
        
        while(*afun != \'\\0\')
            afun++; 
        for(int i = 1;i <= n;i++,afun++)
            *afun = \'a\';
        if (*tr != \'\\0\')
            *afun = \' \';  
    }
    return fun;
}

 

C++代码:

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())
            {
                cout << i << \" \";
                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\");
                str.append(n,\'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\';
    }
};

谢谢。

收藏 打印