1.题目描述
编写一个函数,以字符串作为输入,反转该字符串中的元音字母。
示例 1:
输入: "hello" 输出: "holle"
示例 2:
输入: "leetcode" 输出: "leotcede"
说明:
元音字母不包含字母"y"。
2.思路一:单向遍历,找出元音
Leetcode提交运行时间8ms.
class Solution { public: string reverseVowels(string s) { int size = s.size(); //直接返回 if(size==0 || size==1) return s; //遍历,找出元音字母,保存下标 for(int i=0; i<size; ++i){ if(isVowel(s[i])) idx.push_back(i); } //存在元音字母,反转 if(idx.size()!=0) reverse(s,0,idx.size()-1); return s; } //反转函数 void reverse(string& s, int begin, int end){ for(int m=begin; m<=(begin+end)/2; ++m) swap(s[idx[m]],s[idx[begin+end-m]]); } //判断元音函数 bool isVowel(char v){
//大写与小写 if(v=='a'||v=='i'||v=='o'||v=='u'||v=='e'||v=='A'||v=='I'||v=='O'||v=='U'||v=='E') return true; else return false; } private: vector<int> idx; };
3.思路二:两端从中间遍历,找到立即交换
3.1 下标访问string
class Solution{ public: string reverseVowels(string s){ int sz = s.size(); for(int i=0, j=sz-1; i<j; ++i,--j){ while(i<j && !isVowel(s[i])) ++i; while(i<j && !isVowel(s[j])) --j; swap(s[i],s[j]); } return s; } bool isVowel(char v){ return v=='a'||v=='i'||v=='o'||v=='u'||v=='e'|| v=='A'||v=='I'||v=='O'||v=='U'||v=='E'; } }
3.2 迭代器访问string
class Solution { public: string reverseVowels(string s) { int sz = s.size(); //直接返回 if(sz==0 || sz==1) return s; auto beg = s.begin(), end = s.end()-1; while(beg < end){ //内部while必须再次判断beg<end while(beg<end && !isVowel(*beg)) ++beg; //内部while必须再次判断beg<end while(beg<end && !isVowel(*end)) --end; swap(*beg,*end); ++beg; --end; } return s; } bool isVowel(char v){ return v=='a'||v=='i'||v=='o'||v=='u'||v=='e'|| v=='A'||v=='I'||v=='O'||v=='U'||v=='E'; } };
- 内部while必须再次判断beg<end,举一个反例?