给你一个字符串 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 * 10^4
s
由字母'a'
、'b'
和'c'
组成
解法1:栈
遍历字符串 s,将当前访问到的字符 c 压入栈 stk 中,如果栈元素数目大于等于 3 且栈顶的 3 个元素依次等于 ‘a’、‘b’ 和 ‘c’,那么将这三个元素出栈。如果最后栈为空,则字符串 s 有效。
Java版:
class Solution {
public boolean isValid(String s) {
StringBuffer stack = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
int m = stack.length();
if (m >= 2 && ch == 'c' && stack.substring(m - 2, m).equals("ab")) {
stack.delete(m - 2, m);
} else {
stack.append(ch);
}
}
return stack.length() == 0;
}
}
或:
class Solution {
public boolean isValid(String s) {
StringBuffer stack = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
stack.append(ch);
int m = stack.length();
if (m >= 3 && stack.substring(m - 3, m).equals("abc")) {
stack.delete(m - 3, m);
}
}
return stack.length() == 0;
}
}
Python3版:
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for ch in s:
if len(stack) >= 2 and ch == 'c' and stack[-2] == 'a' and stack[-1] == 'b' :
stack.pop()
stack.pop()
else:
stack.append(ch)
return len(stack) == 0
或:
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for ch in s:
stack.append(ch)
if ''.join(stack[-3:]) == "abc":
stack[-3:] = []
return len(stack) == 0
复杂度分析
-
时间复杂度:O(n),其中 n 是字符串 s 的长度。
-
空间复杂度:O(n)。栈需要占用 O(n) 的空间。