难度简单
给你一个字符串 s
,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'
、'e'
、'i'
、'o'
、'u'
,且可能以大小写两种形式出现。
示例 1:
输入:s = "hello" 输出:"holle"
示例 2:
输入:s = "leetcode" 输出:"leotcede"
提示:
1 <= s.length <= 3 * 105
s
由 可打印的 ASCII 字符组成
除了在 if 判断条件中逐个比较是否 “==” 各个元音字母,我不太清楚怎么去判断当前字符是否为元音字母。
暂且写下这个答案,后边看看题解对照一下。
class Solution {
public:
string reverseVowels(string s) {
int left = 0, right = s.size()-1;
while(left < right){
if (s[left] == yuanyin && s[right] == yuanyin){
swap(s[left], s[right]);
} else if (s[left] = yuanyin){
right--;
}else{
left++;
}
}
return s;
}
};
标准答案
class Solution {
public:
string reverseVowels(string s) {
auto isVowel = [vowels = "aeiouAEIOU"s](char ch) {
return vowels.find(ch) != string::npos;
};
int n = s.size();
int i = 0, j = n - 1;
while (i < j) {
while (i < n && !isVowel(s[i])) {
++i;
}
while (j > 0 && !isVowel(s[j])) {
--j;
}
if (i < j) {
swap(s[i], s[j]);
++i;
--j;
}
}
return s;
}
};
理解这部分花了好久的时间,涉及到的知识点主要有两个:①C++新特性中的lambda表达式;②operator " "s
auto isVowel = [vowels = "aeiouAEIOU"s](char ch) {
return vowels.find(ch) != string::npos;
};
《C++ primer plus》18.4节中介绍了lambda的相关用法:
看相关介绍,对于 [ ]中的非引用的用法是“C++14之后加入的lambda capture initializers”
对于operator " "s的用法
讲解的比较清楚的是一篇知乎的专栏,链接如下
" "s是一种operator,在这里的目的是因为捕获里c++会自动推导变量类型,会把"aeiouAEIOU"推导成const char *const类型,但其实我们需要的是string类型,其实这里""s就是转成string类型等效于vowels = std::string("aeiouAEIOU")。