2026-06-26:移除尾部元音字母。用go语言,给定一个只包含小写英文字母的字符串 s。需要从字符串末尾开始,逐个向前检查:把所有出现在末尾的元音字母(a、e、i、o、u)都删掉。最终返回删完这些“尾部连续元音”后剩下的字符串。
1 <= s.length <= 100。
s 仅由小写英文字母组成。
输入: s = "idea"。
输出: "id"。
解释:
移除 "idea" 后,得到字符串 "id"。
题目来自力扣3856。
分步详细执行过程
步骤1:主程序初始化变量
执行 s := "idea",内存中生成完整字符串字符序列,字符从左到右依次为:索引0=i,索引1=d,索引2=e,索引3=a,完整字符序列:[i, d, e, a],字符串长度为4。
步骤2:调用处理函数 trimTrailingVowels(s)
把字符串 idea 传入函数,函数内部执行 strings.TrimRight(s, "aeiou"),进入库函数截断逻辑,逐轮从尾部校验:
第1轮校验(最末尾字符:索引3,字符a)
字符 a 在元音集合 aeiou 内,满足删除条件,直接截掉末尾的a,剩余字符串:ide,字符序列 [i, d, e]。
第2轮校验(当前新末尾字符:索引2,字符e)
字符 e 在元音集合内,满足删除条件,截掉末尾的e,剩余字符串:id,字符序列 [i, d]。
第3轮校验(当前新末尾字符:索引1,字符d)
字符 d 不在元音集合中,不满足删除条件,立刻终止尾部截断循环,不再向前检查。
步骤3:函数返回结果
截断停止后剩余字符串 id 作为函数返回值,赋值给变量 result。
步骤4:打印输出
执行 fmt.Println(result),控制台输出最终结果字符串 id,流程全部结束。
时间复杂度分析
设输入字符串长度为 n。
strings.TrimRight只会从尾部向前遍历,最坏情况整个字符串全是元音,需要遍历全部 n 个字符;- 其余操作(函数调用、变量赋值、打印)均为常数时间 O(1); 整体总时间复杂度:O(n)。
额外空间复杂度分析
- Go中字符串是不可变类型,截断操作会生成一段全新字符串存储结果;
- 额外存储的新字符串最长为原字符串长度 n,无额外数组、切片、哈希等辅助容器; 整体总额外空间复杂度:O(n)。
Go完整代码如下:
package main
import (
"fmt"
"strings"
)
func trimTrailingVowels(s string) string {
return strings.TrimRight(s, "aeiou")
}
func main() {
s := "idea"
result := trimTrailingVowels(s)
fmt.Println(result)
}
Python完整代码如下:
# -*-coding:utf-8-*-
def trim_trailing_vowels(s: str) -> str:
"""
移除字符串末尾所有的元音字母(小写 a/e/i/o/u)。
与 Go 的 strings.TrimRight(s, "aeiou") 行为一致。
"""
return s.rstrip('aeiou')
def main() -> None:
s = "idea"
result = trim_trailing_vowels(s)
print(result) # 输出: id
if __name__ == "__main__":
main()
C++完整代码如下:
#include <iostream>
#include <string>
std::string trimTrailingVowels(const std::string& s) {
// 查找最后一个不属于元音集合的字符位置
size_t pos = s.find_last_not_of("aeiou");
if (pos == std::string::npos) {
// 如果全是元音,返回空字符串
return "";
}
// 保留从开头到 pos 的子串(包含 pos 处的字符)
return s.substr(0, pos + 1);
}
int main() {
std::string s = "idea";
std::string result = trimTrailingVowels(s);
std::cout << result << std::endl;
return 0;
}