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,tbecomestleft + "abc" + tright, wheret == tleft + tright. Note thattleftandtrightmay 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^4sconsists 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).