题目描述:
给你一个字符串 s ,请你判断它是否 有效 。
字符串 s 有效 需要满足:假设开始有一个空字符串 t = “” ,你可以执行 任意次 下述操作将 t 转换为 s :
将字符串 “abc” 插入到 t 中的任意位置。形式上,t 变为 tleft + “abc” + tright,其中 t == tleft + tright 。注意,tleft 和 tright 可能为 空 。
如果字符串 s 有效,则返回 true;否则,返回 false。
示例 1:
输入:s = "aabcbc"
输出:true
解释:
"" -> "abc" -> "aabcbc"
因此,"aabcbc" 有效。
示例 2:
输入:s = "abcabcababcc"
输出:true
解释:
"" -> "abc" -> "abcabc" -> "abcabcabc" -> "abcabcababcc"
因此,"abcabcababcc" 有效。
示例 3:
输入:s = "abccba"
输出:false
解释:执行操作无法得到 "abccba" 。
示例 4:
输入:s = "cababc"
输出:false
解释:执行操作无法得到 "cababc" 。
提示:
1 <= s.length <= 2 * 104
s 由字母 'a'、'b' 和 'c' 组成
思路:
第一种方法:
这题主要思想是使用栈,将字符串中的字符一一入栈,再判断栈顶元素,若为’c’,则可以将它出栈,再出栈两个元素,分别判断是否等于’b’和’a’,如果其中至少有一个不等于,则直接返回false。
最后一步,返回值为stack.isEmpty(),为1说明满足题目的’abc’串
代码:
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack();
for (int i = 0; i < s.length(); i++) {
stack.push(s.charAt(i));
if (stack.peek() == 'c') {
if (stack.size() >= 3) {
if (stack.pop() == 'c' && stack.pop() == 'b' && stack.pop() == 'a') {
continue;
} else {
return false;
}
}
}
}
return stack.isEmpty();
}
}
第二种方法:
这种方法是直接使用contains()方法:
代码:
class Solution {
public boolean isValid(String s) {
String str = "";
while (s.contains("abc")) {
s = s.replace("abc", "");
}
return s.equals(str);
}
}