【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;
    }
}

 

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