力扣---1003. 检查替换后的词是否有效

allWu / 2023-05-03 / 原文

给你一个字符串 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' 组成

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/check-if-word-is-valid-after-substitutions
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

栈模拟吧。

遇到 'a' , 'b', 时入栈,遇到 'c' 时出栈并判断是否依次为 'b', 'a', 如果中间遇到了栈为空的情况则直接返回 false 。

class Solution {
    public boolean isValid(String s) {
        if (s.length() % 3 != 0) {
            return false;
        }
        Deque<Character> deque = new ArrayDeque<>();
        for (int i = 0; i < s.length(); i++) {
            char tem = s.charAt(i);
            if (tem == 'c') {
                if (deque.isEmpty() || deque.removeLast() != 'b') {
                    return false;
                }
                if (deque.isEmpty() || deque.removeLast() != 'a') {
                    return false;
                }
            } else {
                deque.addLast(tem);
            }
        }
        return deque.isEmpty();
    }
}