题目链接
LeetCode-1003. 检查替换后的词是否有效
题目描述
题解
题解一(Java)
作者:@仲景
题挺难懂的,很绕,然后读懂了就很简单了
就是说本来是一个字符串s,abc三个字符可以随便放在s原本字符串的左边或者右边,但是不能放在中间
然后上面步骤得到一个字符串后,继续放abc,和上面一样,也是只能放在左右
所以说如果答案是true,那么一定有一个abc是连着的,去掉这个abc以后,一定还会诞生另一个连着的abc,所以只要每次判断abc在不在s里,一次一次的把abc去掉就可以了
如果最后abc都会消没了,那么就是对的,如果还留着不成套的abc,那么就是错的
class Solution {
public boolean isValid(String s) {
while (s.contains("abc")) {
s = s.replace("abc", "");
}
return s.length() == 0;
}
}
题解二(Java)
作者:@仲景
由题解一可以得出,如果结果为true,必定有一组abc是相连的,并且去掉一组abc后,还会出现一组相连的,一直到结束
所以我们可以得出结论,如果我们把所有字符依次入栈,遇到abc一组相连就全部弹出,如果结果为true,那么一定可以把所有字符都弹完
那么就可以得出abc的出入栈规则
a:直接入栈
b:如果前面是a就入栈
c:如果前面是b,就把前面的ab全部弹出
那我们就可以实现如下代码
class Solution {
public boolean isValid(String s) {
LinkedList<Character> stack = new LinkedList<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == 'a') {
stack.addLast(c);
} else if (c == 'b') {
if (!stack.isEmpty() && stack.getLast() == 'a') {
stack.addLast(c);
} else {
return false;
}
} else {
if (!stack.isEmpty() && stack.getLast() == 'b') {
stack.removeLast();
stack.removeLast();
} else {
return false;
}
}
}
return stack.isEmpty();
}
}