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