Easy

题目描述

给你一个由小写英文字母组成的字符串 s

返回删除 s 末尾所有元音字母后得到的字符串。

元音字母包括字符 'a''e''i''o''u'

示例 1:

输入:s = "idea"
输出:"id"
解释:删除末尾的元音字母 "ea",得到字符串 "id"。

示例 2:

输入:s = "day"
输出:"day"
解释:字符串 "day" 末尾没有元音字母。

示例 3:

输入:s = "aeiou"
输出:""
解释:删除末尾的所有元音字母 "aeiou",得到空字符串 ""。

提示:

  • 1 <= s.length <= 100
  • s 仅由小写英文字母组成

解题提示:

  • 模拟;只要最后一个字符是元音字母就弹出它。

解题思路

解题思路

这是一道简单的字符串处理题目,核心思想是从字符串末尾开始,逐个删除元音字母直到遇到非元音字母或字符串为空。

方法一:从后往前遍历(推荐)

  • 从字符串的最后一个字符开始向前遍历
  • 判断当前字符是否为元音字母(a, e, i, o, u)
  • 如果是元音字母,继续向前;如果不是,停止遍历
  • 返回从开头到当前位置的子字符串

方法二:使用栈或字符数组模拟

  • 将字符串转换为可修改的结构(如栈或字符数组)
  • 从末尾开始删除元音字母
  • 重新构建字符串

方法三:字符串截取

  • 找到从末尾开始第一个非元音字母的位置
  • 截取字符串到该位置

时间复杂度方面,所有方法都是 O(n),其中 n 是字符串长度。空间复杂度根据实现方式不同而有所差异,最优可以达到 O(1)(不考虑返回值的空间)。

推荐使用方法一,代码简洁且易于理解。

代码实现

class Solution {
public:
    string trimTrailingVowels(string s) {
        int end = s.length() - 1;
        while (end >= 0 && (s[end] == 'a' || s[end] == 'e' || s[end] == 'i' || s[end] == 'o' || s[end] == 'u')) {
            end--;
        }
        return s.substr(0, end + 1);
    }
};
class Solution:
    def trimTrailingVowels(self, s: str) -> str:
        vowels = set('aeiou')
        end = len(s) - 1
        while end >= 0 and s[end] in vowels:
            end -= 1
        return s[:end + 1]
public class Solution {
    public string TrimTrailingVowels(string s) {
        var vowels = new HashSet<char> {'a', 'e', 'i', 'o', 'u'};
        int end = s.Length - 1;
        while (end >= 0 && vowels.Contains(s[end])) {
            end--;
        }
        return s.Substring(0, end + 1);
    }
}
var trimTrailingVowels = function(s) {
    const vowels = new Set(['a', 'e', 'i', 'o', 'u']);
    let end = s.length - 1;
    while (end >= 0 && vowels.has(s[end])) {
        end--;
    }
    return s.substring(0, end + 1);
};

复杂度分析

复杂度类型复杂度
时间复杂度O(n)
空间复杂度O(1)

其中 n 是字符串 s 的长度。时间复杂度为 O(n) 是因为最坏情况下需要遍历整个字符串。空间复杂度为 O(1),不考虑返回值的空间占用。