345
這題 345. Reverse Vowels of a String 算是滿簡單的,也是只要把我們直觀的演算法寫成 code 就好。
直觀想起來的演算法是:
- 先看過這個 s 的全部字母,比對每個字母是不是母音,如果是的話就記錄值跟位置
- 因為我們已經記得每個母音出現的位置,接下來只要把位置反過來填就好,實作上只要把記錄位置的陣列反向,然後把這些字母重新放進 s 即可
對應到實作就是:
class Solution {
public:
string reverseVowels(string s) {
vector<char> vowelVal;
vector<int> vowelPos;
char vowelList[] = { 'a', 'e', 'i', 'o', 'u' };
char * p;
for(int i=0; i<s.length(); i++)
{
p = std::find (vowelList, vowelList+5, s[i]);
if (p != vowelList+5)
{
vowelVal.push_back(s[i]);
vowelPos.push_back(i);
}
}
reverse(vowelPos.begin(),vowelPos.end());
for(int i=0; i<vowelPos.size(); i++)
s[vowelPos[i]]=vowelVal[i];
return s;
}
};
不過這個版本沒有考慮一些特別的 case,第一次 submit 就遇到 s 是 "aA" 時,judge system 說應該要輸出原本的 "Aa",不過我寫的方法會輸出 "aA"。顯然是因為我沒有考慮到大寫的情況,修改一下就可以過了。
class Solution {
public:
string reverseVowels(string s) {
vector<char> vowelVal;
vector<int> vowelPos;
char vowelList[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
char * p;
for(int i=0; i<s.length(); i++)
{
p = std::find (vowelList, vowelList+10, s[i]);
if (p != vowelList+10)
{
vowelVal.push_back(s[i]);
vowelPos.push_back(i);
}
}
reverse(vowelPos.begin(),vowelPos.end());
for(int i=0; i<vowelPos.size(); i++)
s[vowelPos[i]]=vowelVal[i];
return s;
}
};