Check If Word Is Valid After Substitutions 检查替换后的词是否有效
问题描述:
给你一个字符串 s ,请你判断它是否 有效 。
字符串 s 有效 需要满足:假设开始有一个空字符串 t = “” ,你可以执行 任意次 下述操作将 t 转换为 s :
将字符串 “abc” 插入到 t 中的任意位置。形式上,t 变为 tleft + “abc” + tright,其中 t == tleft + tright 。注意,tleft 和 tright 可能为 空 。
如果字符串 s 有效,则返回 true;否则,返回 false。
s.length范围
[
1
,
20000
]
[1,20000]
[1,20000],仅由abc构成。
分析
使用暴力构造的方法,就是每构造一个有效的 s ′ s' s′,然后在 s ′ s' s′的每个位置上插入 a b c abc abc,直到达到目标的 s s s长度。但是 s ′ s' s′越长,枚举的位置越多,时间复杂度也越大。
同样逆向的做dfs,每次找到一个abc,然后删除,但是这样也会面临相同的问题。
还有一种暴力的思路,就是 r e p l a c e replace replace,每一次将所有符合条件的abc,全部用空字符串替换,直到整个 s s s,不存在 a b c abc abc,判断s是否是空字符串。
replace作为封装的string API,确实可以处理这个问题,但是另一方面,这个replace过程中对空间,时间上的消耗,可以思考一下。
这个问题可以抽象成为一个栈,类似于括号匹配。abc可以抽象的作为一个 ( ) () (),
- 遇到字符 a a a,可以直接入栈。
- 遇到字符b,如果要符合条件,那么此时栈顶必须是a,也就是说,如果栈空或者栈顶 t o p ! = a top!=a top!=a,说明无法满足题目的条件,返回 f a l s e false false。否则可以将栈顶 修改为 b 修改为b 修改为b。
- 遇到字符c,其实和字符b是一样的处理,也是只关心栈顶是否是b。
整个流程遍历一次,最大的空间就是开栈,时间复杂度** O ( N ) O(N) O(N),空间** O ( N ) O(N) O(N)。
时间复杂度
O
(
N
)
O(N)
O(N)
空间复杂度:
O
(
N
)
O(N)
O(N)
代码
public boolean isValid(String s) {
while(s.indexOf("abc")!=-1){
s = s.replace("abc","");
}
return s.equals("");
}
时间复杂度
O
(
N
)
O(N)
O(N)
空间复杂度:
O
(
N
)
O(N)
O(N)
public boolean isValid(String s) {
Deque<Integer> st = new ArrayDeque();
for(int i=0;i<s.length();i++){
int c = s.charAt(i)-'a';
if(c==0){
st.push(c);
continue;
}
if(st.isEmpty()) return false;
int top = st.pop();
if(c-top!=1)return false;
if(c==1){
st.push(c);
}
}
return st.isEmpty();
}
代码还可以再压缩,但是基本流程是这样。
时间复杂度
O
(
N
)
O(N)
O(N)
空间复杂度:
O
(
N
)
O(N)
O(N)文章来源:https://www.toymoban.com/news/detail-434085.html
Tag
栈
文章来源地址https://www.toymoban.com/news/detail-434085.html
到了这里,关于【算法】Check If Word Is Valid After Substitutions 检查替换后的词是否有效的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!