LeetCode——2645. 构造有效字符串的最少插入数

本文介绍了使用栈实现的算法,解决给定字符串word中在特定位置最少添加a、b、c字母使其成为abc序列的问题,涉及数据结构和编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过万岁!!!

  • 题目:给你一个只会有a、b、c三个字母构成的字符串word,然后让你在任意位置添加a、b、c三个字母,使得word变成全都由abc这个字符串拼接而成的字符串。问最少需要插入多少次字母。
  • 思路:其实这个题目跟昨天的2696. 删除子串后的字符串最小长度有异曲同工之妙,我们依旧可以用栈。这一次栈的元素使用去检验相邻的是不是满足abc了。我们for循环word,如果栈是空的话,那么当前元素如果是a,则可以直接入栈。如果是b,则需要插入一个a,才可以入栈。如果是c,则需要插入一个a和一个b才可以入栈。如果栈不是空,则判断栈顶元素,如果栈顶元素是a,然后再判断。如果当前元素是a,则需要入栈一个b和c之后,当前元素才可以入栈。以此类推。需要注意的是,为了节省空间,我们可以不真的入栈,我们添加的元素。只需要用ret记录加了几个元素就好了,并且加入的元素如果满足了abc,则清空这个栈。还有就是最后我们需要判断一下栈是不是空,处理一下栈内剩余的元素。
  • 技巧:栈

java代码

class Solution {
    public int addMinimum(String word) {
        int ret = 0;
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < word.length(); i++) {
            if (stack.isEmpty()) {
                if (word.charAt(i) == 'a') {
                    stack.push(word.charAt(i));
                } else if (word.charAt(i) == 'b') {
                    ret++;
                    stack.push(word.charAt(i));
                } else {
                    ret += 2;
                }
            } else {
                if (stack.peek() == 'a') {
                    if (word.charAt(i) == 'b') {
                        stack.push(word.charAt(i));
                    } else if (word.charAt(i) == 'c') {
                        ret++;
                        stack.pop();
                    } else {
                        ret += 2;
                    }
                } else if (stack.peek() == 'b') {
                    if (word.charAt(i) == 'b') {
                        ret += 2;
                        stack.clear();
                        stack.push(word.charAt(i));
                    } else if (word.charAt(i) == 'c') {
                        stack.clear();
                    } else {
                        stack.clear();
                        stack.push(word.charAt(i));
                        ret++;
                    }
                }
            }
        }
        if (!stack.isEmpty()) {
            if (stack.peek() == 'a') {
                ret += 2;
            } else {
                ret++;
            }
        }
        return ret;
    }
}
  • 总结:因为昨天做过了一个类似的题目,所以感觉这个没有特别难,主要是要判断的情况比较多。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值