目录链接:
力扣编程题-解法汇总_分享+记录-CSDN博客
GitHub同步刷题项目:
https://github.com/September26/java-algorithms
原题链接:力扣
描述:
给你一个字符串 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" 。
提示:
1 <= s.length <= 2 * 104
s
由字母'a'
、'b'
和'c'
组成
解题思路:
* 解题思路: * 构建栈结构stack, * 如果遇到a,就压栈1,代表目前栈顶为a。 * 如果遇到b并且栈顶为1时,就把栈顶改为2,代表目前栈顶为ab。 * 如果遇到c并且栈顶为2时,就把栈顶去掉,因为目前栈顶为abc,符合移除的条件。 * 如果时其它场景,则证明不匹配,返回false。
代码:
public class Solution1003 {
public boolean isValid(String s) {
Stack<Integer> stack = new Stack<>();
char[] chars = s.toCharArray();
for (char aChar : chars) {
if (aChar == 'a') {
stack.add(1);
continue;
}
if (stack.size() == 0) {
return false;
}
Integer peek = stack.peek();
if (peek == 1 && aChar == 'b') {
stack.set(stack.size() - 1, peek + 1);
continue;
}
if (peek == 2 && aChar == 'c') {
stack.pop();
continue;
}
return false;
}
return stack.size() == 0;
}
}