【LeetCode】检查替换后的词是否有效

题目描述

给定有效字符串 "abc"。

对于任何有效的字符串 V,我们可以将 V 分成两个部分 X 和 Y,使得 X + Y(X 与 Y 连接)等于 V。(X 或 Y 可以为空。)那么,X + "abc" + Y 也同样是有效的。

例如,如果 S = "abc",则有效字符串的示例是:"abc","aabcbc","abcabc","abcabcababcc"。无效字符串的示例是:"abccba","ab","cababc","bac"。

如果给定字符串 S 有效,则返回 true;否则,返回 false。

解题思路

我们需要找到完整的abc,遍历到c的时候看一下栈的最上面两个是不是顺序的b,a,不是直接false,因为这样插入的一定不是abc

代码

顺便提一下为啥不用Stack作为栈,而用双向队列,java官方就是这么推荐用的,不推荐用Stack,因为它继承了Vector类,这是一个动态数组,有能力在任意位置,而不仅仅是队首或队尾添加或者删除元素。

package str;

import java.util.Deque;
import java.util.LinkedList;

/**
 * 1003. 检查替换后的词是否有效
 * 给定有效字符串 "abc"。
 *
 * 对于任何有效的字符串 V,我们可以将 V 分成两个部分 X 和 Y,使得 X + Y(X 与 Y 连接)等于 V。(X 或 Y 可以为空。)那么,X + "abc" + Y 也同样是有效的。
 *
 * 例如,如果 S = "abc",则有效字符串的示例是:"abc","aabcbc","abcabc","abcabcababcc"。无效字符串的示例是:"abccba","ab","cababc","bac"。
 */

public class isValid {
    public boolean isValid(String S) {
        // 模拟栈
        Deque<Character> stack= new LinkedList<>();
        for(int i = 0;i < S.length();i++) {
            // 返回队列的头,且不移除
            if(stack.peek() == null || S.charAt(i)!='c') {
                stack.push(S.charAt(i));
            }else {
                // 如果||左边为true,右边不再执行
                // poll()是Queue(队列)的一个方法,获取并移除此队列的头,如果此队列为空,则返回null
                if(stack.peek()==null || stack.poll()!='b') {
                    return false;
                }
                if(stack.peek()==null || stack.poll()!='a') {
                    return false;
                }
            }
        }
        return stack.peek()==null;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章