当前位置: 首页 > article >正文

【算法】Check If Word Is Valid After Substitutions 检查替换后的词是否有效

文章目录

  • Check If Word Is Valid After Substitutions 检查替换后的词是否有效
    • 问题描述:
    • 分析
    • 代码
  • Tag

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],仅由abc构成。

分析

使用暴力构造的方法,就是每构造一个有效的s’,然后在s’的每个位置上插入abc,直到达到目标的s长度。但是s’越长,枚举的位置越多,时间复杂度也越大。
同样逆向的做dfs,每次找到一个abc,然后删除,但是这样也会面临相同的问题。

还有一种暴力的思路,就是replace,每一次将所有符合条件的abc,全部用空字符串替换,直到整个s,不存在abc,判断s是否是空字符串。
replace作为封装的string API,确实可以处理这个问题,但是另一方面,这个replace过程中对空间,时间上的消耗,可以思考一下。

这个问题可以抽象成为一个栈,类似于括号匹配。abc可以抽象的作为一个(),遇到字符a,可以直接入栈。遇到字符b,如果要符合条件,那么此时栈顶必须是a,也就是说,如果栈空或者栈顶!=a,说明无法满足题目的条件,返回false。否则可以将栈顶修改为b。遇到字符c,其实和字符b是一样的处理,也是只关心栈顶是否是b。
整个流程遍历一次,最大的空间就是开栈,时间复杂度ON,空间ON。

时间复杂度 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)

 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(); 
    }

代码还可以再压缩,但是基本流程是这样。

Tag


http://www.kler.cn/news/17791.html

相关文章:

  • MySQL高频面试题
  • 多通道振弦传感器无线采集仪通过短信和FTP文件修改参数
  • 设计原则之【接口隔离原则】
  • 22.Java多线程
  • SpreadJS 16.1 EN + SpreadJS 16.1 CN Crack
  • 【Linux】linux进程间通信netlink socket(用户与内核通信)
  • PBDB Data Service:Special parameters(特殊参数)
  • 公司新来的00后真是卷王,工作没2年,跳槽到我们公司起薪18K都快接近我了
  • JAVA原生语言开发多学校Saas模式校园管理系统
  • LT8471IFE#PBF-ASEMI代理亚德诺LT8471IFE#PBF原厂芯片
  • 文件操作和IO
  • 机器视觉工程师,听我一句劝,别去外包,干了三年,废了....对女人没了兴趣
  • 【Unity编辑器】拓展Project视图
  • 复兴号列车司机室
  • Midjourney之logo设计(建议收藏)
  • 杂乱之Android的字体相关类Typeface
  • 一道2023年数学分析真题
  • 【Linux】Linux安装Nexus(图文解说详细版)
  • 基于numpy的鸢尾花数据获取、处理等操作。
  • Android14新权限机制
  • 2023-05-04 LeetCode每日一题(摘水果)
  • 行为型模式-解释器模式
  • 了解进程控制
  • 错题汇总03
  • 顺序表和链表优缺点以及区别
  • MySQL索引
  • 涨薪60%,从小厂逆袭,坐上美团技术专家(面经+心得)
  • Java——和为S的连续正数序列
  • 【C++】机房预约系统
  • 使用【SD-WEBUI】插件生成单张图包含多个人物:分区域的提示词