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 <= 100s仅由小写英文字母组成
解题提示:
- 模拟;只要最后一个字符是元音字母就弹出它。
解题思路
解题思路
这是一道简单的字符串处理题目,核心思想是从字符串末尾开始,逐个删除元音字母直到遇到非元音字母或字符串为空。
方法一:从后往前遍历(推荐)
- 从字符串的最后一个字符开始向前遍历
- 判断当前字符是否为元音字母(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),不考虑返回值的空间占用。