LeetCode#1047-Remove All Adjacent Duplicates In String-刪除字符串中的所有相鄰重複項

一、題目

給出由小寫字母組成的字符串 S,重複項刪除操作會選擇兩個相鄰且相同的字母,並刪除它們。

在 S 上反覆執行重複項刪除操作,直到無法繼續刪除。

在完成所有重複項刪除操作後返回最終的字符串。答案保證唯一。

示例:

輸入:"abbaca"
輸出:"ca"
解釋:
例如,在 "abbaca" 中,我們可以刪除 "bb" 由於兩字母相鄰且相同,這是此時唯一可以執行刪除操作的重複項。
之後我們得到字符串 "aaca",其中又只有 "aa" 可以執行重複項刪除操作,所以最後的字符串爲 "ca"。

提示:

  1. 1 <= S.length <= 20000
  2. S 僅由小寫英文字母組成。

二、題解

  • 題解1:PHP自帶的函數str_replace

將 aa 到 zz 的 26 種重複項放入集合中,將字符串中這些重複項替換成空字符串。

function removeDuplicates($S) {
    $vowels = ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii', 'jj', 'kk', 'll', 'mm', 'nn', 
    'oo', 'pp', 'qq', 'rr', 'ss', 'tt', 'uu', 'vv', 'ww', 'xx', 'yy', 'zz'];

    while (strlen($S) >= 2) {
        $S = str_replace($vowels, "", $S);
        if ($S == str_replace($vowels, "", $S)) {
            break;
        }
    }
    
    return $S;
}
  • 題解2:出隊入棧結合

首先把字符串轉化爲數組,可以把這個字符串數組當做一個隊列;
設置一個棧,判斷字符串數組的隊頭元素和棧頂元素是否相等,如果不相等,就將字符串數組的隊首元素出隊,壓入棧中,
反之,則將隊首元素出隊,同時將棧頂元素彈出。
時間複雜度:O(N),空間複雜度:O(N)。

function removeDuplicates($S) {
    if (strlen($S) <= 1) {
        return $S;
    }

    $stack = [];
    $arr = str_split($S);
    while (!empty($arr)) {
        if (empty($stack)) {
            $stack[] = array_shift($arr);
        } else {
            if (current($arr) == end($stack)) {
                array_shift($arr);
                array_pop($stack);
            } else {
                $stack[] = array_shift($arr);
            }
        }
    }
    return implode("", $stack);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章