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