反直觉正循环删除

反直觉的正向循环(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 协议》,转载必须注明作者和本文链接
pardon110
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
开发者 @ 社科大
文章
133
粉丝
24
喜欢
100
收藏
54
排名:107
访问:8.9 万
私信
所有博文
社区赞助商