Problem
Given a string s
, determine if it is valid.
A string s
is valid if, starting with an empty string t = ""
, you can **transform *t
* into **s
after performing the following operation *any number of times*:
- Insert string
"abc"
into any position int
. More formally,t
becomestleft + "abc" + tright
, wheret == tleft + tright
. Note thattleft
andtright
may be empty.
Return true
**if *s
* is a valid string, otherwise, return** false
.
Example 1:
Input: s = "aabcbc"
Output: true
Explanation:
"" -> "abc" -> "aabcbc"
Thus, "aabcbc" is valid.
Example 2:
Input: s = "abcabcababcc"
Output: true
Explanation:
"" -> "abc" -> "abcabc" -> "abcabcabc" -> "abcabcababcc"
Thus, "abcabcababcc" is valid.
Example 3:
Input: s = "abccba"
Output: false
Explanation: It is impossible to get "abccba" using the operation.
Constraints:
1 <= s.length <= 2 * 10^4
s
consists of letters'a'
,'b'
, and'c'
Solution (Java)
class Solution {
public boolean isValid(String s) {
Deque<Character> stack = new ArrayDeque<>();
for (char c : s.toCharArray()) {
if (c == 'c') {
if (stack.isEmpty() || stack.pop() != 'b') {
return false;
}
if (stack.isEmpty() || stack.pop() != 'a') {
return false;
}
} else {
stack.push(c);
}
}
return stack.isEmpty();
}
}
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).