LeetCode#345-Reverse Vowels of a String-反轉字符串中的元音字母

一、題目

編寫一個函數,以字符串作爲輸入,反轉該字符串中的元音字母。

示例 1:

輸入: "hello"
輸出: "holle"

示例 2:

輸入: "leetcode"
輸出: "leotcede"

說明:元音字母不包含字母"y"。

二、題解

英語中的元音字母有 a, e, i, o, u 五個,考慮大小寫的話,加上 A, E, I, O, U,遇到這些元音字母,需要反轉元音字母,但其它輔音字母的位置不變。

這道題其實和 #344 題很像,用雙指針法。遍歷數組,一個指針從前向後掃描,一個指針從後向前掃描,當前後都掃描出元音,就交換兩個元音。直到左指針大於等於右指針,就結束。

時間複雜度:O(N),空間複雜度:O(1)。

function reverseVowels($s) {
    // 如果字符串爲空,或只有一個字符,就沒必要反轉了
    if (strlen($s) <= 1) {
        return $s;
    }

    $vowelMap = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'];
    
    $len = strlen($s);
    $left = 0;
    $right = $len - 1;
    while ($left < $right) {
        // 從左判斷當前元素是不是元音,若不是,則 left 指針右移
        while (!in_array($s[$left], $vowelMap) && $left < $len) {
            $left++;
        }
        
        // 從右判斷當前元素是不是元音,若不是,則 right 指針左移
        while (!in_array($s[$right], $vowelMap) && $right >= 0) {
            $right--;
        }
        
        // 如果沒有元音
        if ($left >= $right) {
            break;
        }

        // 交換前後元音
        // 如果前後元音相等,不需要交換了,直接移動左右指針
        if ($s[$left] != $s[$right]) {
            $temp = $s[$left];
            $s[$left] = $s[$right];
            $s[$right] = $temp;
        }

        $left++;
        $right--;
    }
    return $s;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章