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