算法小知识-----04.21-----山羊拉丁文

187 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

今天的这道题属实是用例题

山羊拉丁文

该题出自力扣的824题 —— 山羊拉丁文【简单题】

审题

image.png

  • 该题的题意有点绕,但是并不影响它身为简单题 —— 给出一个字符串,字符串由一串单词和空格组成,单词由空格隔开。
    • 每个元音字母为开头的单词,在末尾加上"ma"
    • 如果非语音字母,则把首字母移动到末尾,再加上“ma”
    • 根据单词的下标决定在单词的末尾加多少个“a”
  • 首先需要注意的是,字母是忽略大小写的。
  • 解法:直接枚举
    • 把字符串利用split拆分成数组
    • 定义一个StringBuilder,去作为末尾添加"a"的个数,初始值为一个a
    • 遍历数组
      • 定义一个StringBuilder
      • 获取字符串的首个字符,判断是否为元音(a/e/i/o/u/A/E/I/O/U),如果为元音,则用StringBuilder.append方法加上“ma”
      • 如果不是元音,则利用substring(1)方法截取第一个字符后的所有字符,再用append方法拼接
    • 最后再遍历一次把数组拼接起来
    • 这里一开始是想使用StringUtils包里面的join方法的,Leetcode本身并不支持,所以只能自己遍历拼接了
    • 时间复杂度为O(n),因为遍历数组一次循环
    • 空间复杂度为O(n),取决于是否使用额外的空间去存储字符串切片,如果不修改,则需要用一个Set或者Map去存储,O(n2) 的空间临时存储所有单词修改后的结果

编码

class Solution {
    public String toGoatLatin(String sentence) {
        String[] s = sentence.split(" ");
        StringBuilder sba = new StringBuilder("a");
        for (int i = 0;i<s.length;i++) {
            String a = s[i];
            StringBuilder sb = new StringBuilder();
            char c = a.charAt(0);
            switch (c){
                case 'A':
                case 'E':
                case 'I':
                case 'O':
                case 'U':
                case 'a':
                case 'e':
                case 'i':
                case 'o':
                case 'u':
                    sb.append(a);
                    sb.append("ma");
                    break;
                default:
                    sb.append(a.substring(1));
                    sb.append(c);
                    sb.append("ma");
                    break;
            }
            sb.append(sba.toString());
            sba.append("a");
            s[i] = sb.toString();
        }
        StringBuilder sbq = new StringBuilder();
        for(String q:s){
            sbq.append(q);
            sbq.append(" ");
        }
        sbq.deleteCharAt(sbq.length() -1);
        return sbq.toString();
    }
}

image.png