LeetCode#1047-Remove All Adjacent Duplicates In String-刪除字串中的所有相鄰重複項
阿新 • • 發佈:2020-04-05
#### 一、題目
給出由小寫字母組成的字串 S,重複項刪除操作會選擇兩個相鄰且相同的字母,並刪除它們。
在 S 上反覆執行重複項刪除操作,直到無法繼續刪除。
在完成所有重複項刪除操作後返回最終的字串。答案保證唯一。
示例:
```
輸入:"abbaca"
輸出:"ca"
解釋:
例如,在 "abbaca" 中,我們可以刪除 "bb" 由於兩字母相鄰且相同,這是此時唯一可以執行刪除操作的重複項。
之後我們得到字串 "aaca",其中又只有 "aa" 可以執行重複項刪除操作,所以最後的字串為 "ca"。
```
提示:
1. 1 <= S.length <= 20000
2. S 僅由小寫英文字母組成。
#### 二、題解
* 題解1:PHP自帶的函式`str_replace`
將 aa 到 zz 的 26 種重複項放入集合中,將字串中這些重複項替換成空字串。
```php
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)。
![](https://img2020.cnblogs.com/blog/953680/202004/953680-20200404222415732-855106901.png)
```php
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