carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode824:山羊拉丁文(goat-latin) #142

Open carloscn opened 1 year ago

carloscn commented 1 year ago

问题描述

给你一个由若干单词组成的句子 sentence ,单词间由空格分隔。每个单词仅由大写和小写英文字母组成。

请你将句子转换为 “山羊拉丁文(Goat Latin)”(一种类似于 猪拉丁文 - Pig Latin 的虚构语言)。山羊拉丁文的规则如下:

如果单词以元音开头('a', 'e', 'i', 'o', 'u'),在单词后添加"ma"。 例如,单词 "apple" 变为 "applema" 。 如果单词以辅音字母开头(即,非元音字母),移除第一个字符并将它放到末尾,之后再添加"ma"。 例如,单词 "goat" 变为 "oatgma" 。 根据单词在句子中的索引,在单词最后添加与索引相同数量的字母'a',索引从 1 开始。 例如,在第一个单词后添加 "a" ,在第二个单词后添加 "aa" ,以此类推。 返回将 sentence 转换为山羊拉丁文后的句子。

示例 1:

输入:sentence = "I speak Goat Latin" 输出:"Imaa peaksmaaa oatGmaaaa atinLmaaaaa" 示例 2:

输入:sentence = "The quick brown fox jumped over the lazy dog" 输出:"heTmaa uickqmaaa rownbmaaaa oxfmaaaaa umpedjmaaaaaa overmaaaaaaa hetmaaaaaaaa azylmaaaaaaaaa ogdmaaaaaaaaaa"   提示: 1 <= sentence.length <= 150 sentence 由英文字母和空格组成 sentence 不含前导或尾随空格 sentence 中的所有单词由单个空格分隔

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/goat-latin

carloscn commented 1 year ago

问题分析

按照常规进行即可:

fn is_vowel_str(in_str:&str) -> bool
{
    if (*in_str).starts_with("a") ||
       (*in_str).starts_with("e") ||
       (*in_str).starts_with("i") ||
       (*in_str).starts_with("o") ||
       (*in_str).starts_with("u") ||
       (*in_str).starts_with("A") ||
       (*in_str).starts_with("E") ||
       (*in_str).starts_with("I") ||
       (*in_str).starts_with("O") ||
       (*in_str).starts_with("U") {
        return true;
    }

    return false;
}

fn rewrite(in_str:&str) -> String
{
    let mut ret_str:String = String::new();

    if is_vowel_str(in_str) {
        ret_str.push_str(in_str);
        ret_str.push_str("ma");
    } else {
        ret_str.push_str(&in_str[1..in_str.len()]);
        ret_str.push_str(&in_str[0..1]);
        ret_str.push_str("ma");
    }

    return ret_str;
}

fn goat_latin(in_str:&String) -> String
{
    let mut ret_str:String = String::new();
    let mut in_str_list:Vec<&str> = (*in_str).split(" ").collect();
    let mut i:usize = 1;
    let mut j:usize = 0;

    for e in in_str_list {
        let ret = rewrite(e);
        ret_str.push_str(&ret);
        while j < i {
            ret_str.push('a');
            j += 1;
        }
        ret_str.push(' ');
        i += 1;
        j = 0;
    }

    ret_str.pop();

    return ret_str;
}
carloscn commented 1 year ago

code

https://github.com/carloscn/structstudy/commit/9bcaaa2168904098cb23a57b7f9235731415c8a1 https://review.gerrithub.io/c/carloscn/structstudy/+/550756