1. 程式人生 > 其它 >doris-基於10億資料量隨機取3000萬-700萬高併發壓測

doris-基於10億資料量隨機取3000萬-700萬高併發壓測

1047. 刪除字串中的所有相鄰重複項

題目連結:1047.刪除字串中的所有相鄰重複項(簡單)

題目描述

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

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

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

示例:

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

提示:

  • 1 <= S.length <= 20000

  • S 僅由小寫英文字母組成。

題解

思路:這道題可以利用”棧“來實現,如下圖所示。如果棧為空,將當前的字元推入棧中;如果棧不為空,則比較當前的字元和棧頂元素,如果相同就彈出棧頂元素,如果不同就將當前元素推入棧。

程式碼(C++)

string removeDuplicates(string s) {
    stack<char> sta;
    //空棧不能呼叫top()
    for (int i = 0; i < s.size(); i++) {
        if (sta.empty()) sta.push(s[i]);
        else if (sta.top() == s[i]) sta.pop();
        
else sta.push(s[i]); } s = ""; while (!sta.empty()) { char temp = sta.top(); sta.pop(); s += temp; } //字串翻轉 for (int i = 0, j = s.size() - 1; i < j; i++, j--) { char temp = s[i]; s[i] = s[j]; s[j] = temp; } return s;
}

分析

  • 時間複雜度:O(N),N為字串的長度。

  • 空間複雜度:O(N)。

在 C++ 語言中,std::string 類本身就提供了類似「入棧」和「出棧」的介面,因此我們可以直接將需要被返回的字串作為棧即可。對於其他的語言,如果字串類沒有提供相應的介面,則需要在遍歷完成字串後,使用棧中的字元顯式地構造出需要被返回的字串。

程式碼(C++)

string removeDuplicates(string s) {
    string result = "";
    for (char i : s) {
        if (result.empty() || i != result.back()) {
            result.push_back(i);
        } else {
            result.pop_back();
        }
    }
    return result;
}