[每日算法] leetcode第345题 Reverse Vowels of a String

345 Reverse Vowels of a String

原题目描述

Write a function that takes a string as input and reverse only the vowels of a string.

Example 1:

    Input: "hello"
    Output: "holle"

Example 2:

    Input: "leetcode"
    Output: "leotcede"

题目大意

将字符串中的元音字母取出,并进行这些元音字符进行翻转。

解题思路及代码实现

解法一:
最容易想到的莫过于直接将字符串遍历一遍,记录下将字符串中的元音字符及其位置,然后在将其进行一次翻转即可,算法的时间复杂度为O(n),空间复杂度也为O(n)。代码实现如下:

class Solution {
public:
    string reverseVowels(string s) {
        vector<int> v;
        for (int i = 0; s[i] != 0; i++) {
            if (s[i] == 'a'||s[i] == 'o'||s[i] == 'i'||s[i] == 'e'||s[i] == 'u'||
               s[i] == 'A'||s[i] == 'O'||s[i] == 'I'||s[i] == 'E'||s[i] == 'U')
                v.push_back(i);
        }
        int len = v.size();
        for (int i = 0; i < len/2; i++)
            swap(s[v[i]], s[v[len-i-1]]);
        return s;
    }
};

解法二:
在解法一的基础上进行修改,因为要获取所有的元音字符,遍历字符串是必须的,所有O(n)的时间复杂度是没办法精简的,那么,是否可以精简空间复杂度呢,答案是可以的,我们可以在原字符串上进行操作,不用额外开一个数组存储其元音字符位置,此处参考快排的思路,即设置两个头尾指针,向中间移动,当两个指针指向都是元音且不相遇,则进行交换,否则,前进直至相遇。代码如下:

class Solution {
public:
    bool isVowel(char c){
        return (c=='a' || c=='e' || c=='i' || c=='o'||c=='u'|| c=='A'|| c=='E'|| c=='I'||c=='O'||c=='U');
    }
    string reverseVowels(string s) {
        int i=0;
        int j=s.length()-1;
        
        while(i<j){
            
            while(i<j && !isVowel(s[i]))
                i++;
            while(i<j && !isVowel(s[j]))
                j--;
            if(i<j) {
                swap(s[i],s[j]);
                i++;
                j--;
            }
        }
        return s;
    }
};

如上处理,我们的空间复杂度便由O(n)缩减到了O(1),理论上运行时间也会减少,毕竟少了遍历元音数组的时间。

你可能感兴趣的:(算法题目)