題目描述
給定有效字符串 "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;
}
}