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

392. 判断子序列

https://leetcode.cn/problems/is-subsequence/?envType=study-plan-v2&envId=top-interview-150
因为是子序列我们只要关心后一个字符在前一个字符后面出现过就行,至于在哪出现出现几次我们不关心,所以我们可以用HashMap<Character, ArrayList<Integer>> map;这个数据结构来存每一个字符出现过的位置然后遍历s,找到s中每一个字符在t中出现的位置(并且要在前一个字符的后面第一个,因为list是有序的我们可以通过二分来找),如果没找到则返回false,如果找到了则更新preIndex,继续遍历s,直到遍历完s,返回true.
题目后面那个拓展应该是让我们保留状态,我能想到比较好的方法就是构造字典树了,比如构造长度为i的字符串的字典树(1<i<=n),这样只用拿长度为i的字符串到对于长度的字典树匹配就行字典树匹配的时间是log n,总的时间就是nlog n,但是构造这样一个字典树组很麻烦,暂时只能想到这了。

class Solution {

    public static void main(String[] args) {
        String s = "abc";
        String t = "ahbgdc";
        System.out.println(new Solution().isSubsequence(s, t));
    }

    public boolean isSubsequence(String s, String t) {
        int len_s = s.length(), len_t = t.length();
        HashMap<Character, ArrayList<Integer>> map = new HashMap<>();//记录字符出现的位置
        for(int i = 0; i < len_t; i++) {
            if(!map.containsKey(t.charAt(i))) {
                ArrayList<Integer> list = new ArrayList<>();
                map.put(t.charAt(i), list);
            }
            map.get(t.charAt(i)).add(i);
        }
        int preIndex = -1, currIndex = 0;//preIndex记录上一个字符出现的位置,currIndex记录当前字符出现的位置
        int index = 0;//当前在找的字符
        while(index < len_s) {
            if(!map.containsKey(s.charAt(index))) {//如果s中出现了t中没有的字符,则直接返回false
                return false;
            }
            currIndex = getCurrIndex(preIndex, map.get(s.charAt(index)));//获取当前字符在t中出现的下一个位置
            if(currIndex == -1) return false;//没找到
            else {
                preIndex = currIndex;//更新preIndex
            }
            index++;
        }
        return true;
    }

    //找当前字符在前一个字符下标后第一次出现的下标
    public int getCurrIndex(int preIndex, ArrayList<Integer> list) {//通过二分找到一个出现在上一个字符后的待找字符
        int left = 0, right = list.size() - 1;
        while(left < right) {
            int mid = (left + right) >> 1;
            if(list.get(mid) > preIndex) right = mid;
            else left = mid + 1;
        }
        return list.get(left) > preIndex ? list.get(left) : -1;
    }
}

相关文章:

  • 013_File和IO流
  • 蓝桥云客--黑白皇后
  • fisco-bcos 关于服务bash status.sh启动runing 中但是5002端口监听不到,出错的问题
  • Dynamic Programming(LeetCode 740)
  • 串联所有单词的字串 --- 滑动窗口
  • Python 网络请求利器:requests 包详解与实战
  • nt!KeRemoveQueue 函数分析之加入队列后进入等待状态
  • Verilog学习-1.模块的结构
  • 图灵逆向——题六-倚天剑
  • 费马小定理
  • FRP调用本地摄像头完成远程拍照
  • 2台8卡L20服务器集群推理方案
  • FlashDB 在嵌入式系统中占用硬件资源
  • 2025 跨平台技术如何选:KMP 与 Flutter 的核心差异
  • 【ISP】ISP pipeline(AI)
  • 创建采购申请报错不可能为销售订单或项目库存确定科目 消息号 ME558
  • dubbo配置中心
  • 内核态切换到用户态
  • ①(PROFINET 转 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
  • 【Nodebb系列】Nodebb笔记写入方案
  • 建设网站简单吗/淘宝搜索词排名查询
  • destoon 网站搬家/中国seo
  • 网页设计与制作图片显示不出来/seo顾问
  • 电脑关键字被限制 购物网站/谷歌排名规则
  • 网站建设与seo优化的公司/微信广告投放收费标准
  • 草桥有做网站公司吗/青岛网站推广公司排名