leetcode824.山羊拉丁文(Goat Latin)C C++

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

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

谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值