反直覺正迴圈刪除

pardon110發表於2020-09-14

反直覺的正向迴圈(i++)刪除元素,看似不可取,但在某些時候恰到好處。

正向刪除可變迴圈物件,往往會產生不可期結果。
但採取類似回拔這種行為,來消除其副作用,在合適的時機,地點使用,會有情理之中的巧妙。

問題

給你一個字串 s,「k 倍重複項刪除操作」將會從 s 中選擇 k 個相鄰且相等的字母,並刪除它們,使被刪去的字串的左側和右側連在一起。

你需要對 s 重複進行無限次這樣的刪除操作,直到無法繼續為止。
在執行完所有刪除操作後,返回最終得到的字串。

輸入:s = "pbbcggttciiippooaais", k = 2
輸出:"ps"

來源:力扣(LeetCode)
連結:leetcode-cn.com/problems/remove-al...

分析

  • 本文用切片模擬棧的操作(list容器太重,麻煩)
  • 一個充作計數器棧,一個為可變的位元組切片棧
  • 在迴圈體內,位元組切片棧發生修改時,修正迴圈變數i差值

實現

func removeDuplicates(s string, k int) string {
    cnt :=[]int{}
    stack :=[]byte(s)

    for i:=0;i<len(stack);i++{
        if i==0 || stack[i]!=stack[i-1]{
            cnt = append(cnt,1)
        }else{
            top := cnt[len(cnt)-1]
            cnt = cnt[:len(cnt)-1]
            if top+1==k{
                stack = append(stack[:i-k+1],stack[i+1:]...)
                i-=k
            }else{
                cnt = append(cnt,top+1)
            }
        }
    }
    return string(stack)
}

整理字串

一個由大小寫英文字母組成的字串 s

輸入:s = "abBAcC"
輸出:""
解釋:存在多種不同情況,但所有的情況都會導致相同的結果。例如:
"abBAcC" --> "aAcC" --> "cC" --> ""
"abBAcC" --> "abBA" --> "aA" --> ""

連結:leetcode-cn.com/problems/make-the-...

解析

  • 同等字母字元大小寫差值32
  • 回拔一個刪除位2,執行順序 自增,條件判定
  • 注意陣列可能存在的越界情況

上碼

func makeGood(s string) string {
    rs :=[]byte(s)
    for i:=0;i<len(rs);i++{
        if i>0 && (rs[i]+32 ==rs[i-1] || rs[i]==rs[i-1]+32){
            if i+1 == len(rs){
                rs = rs[:i-1]
            }else{
                rs = append(rs[:i-1],rs[i+1:]...)
            }
            i-=2
        }
    }
    return string(rs)
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章