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

通过万岁!!!

  • 题目:给你一个只会有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;
    }
}
  • 总结:因为昨天做过了一个类似的题目,所以感觉这个没有特别难,主要是要判断的情况比较多。

你可能感兴趣的:(算法,leetcode,算法,java)