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

129、LeetCode-392.判断子序列

题目:简单题

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/is-subsequence

思路:

(1)类似于之前127的最长公共子序列!

前一道题主要是使用二维dp数组,记录当前位置时,公共子序列的长度;

这道题只需要最后比较,到达最后位置时,最长子序列的长度是否和较短的字串长度相同!

这道题明确了字符串的长短关系;分出了主次,而前面一道没有分出主次!

(2)双指针,省去了许多没必要的比较

代码:

1)动态规划:时间复杂度不好 O(M*N)

class Solution {
    public boolean isSubsequence(String s, String t) {
        //子序列的判断,前面有最长公共子序列的判断
        //明确了s短,t长
        int sl = s.length();
        int tl = t.length();
        int[][] dp = new int[tl + 1][sl + 1];

        for(int i = 1;i <= tl;i++){
            for(int j = 1;j <= sl;j++){
                if(s.charAt(j - 1) == t.charAt(i - 1)){
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                }
                else{
                    //dp[i][j] = Math.max(dp[i - 1][j],dp[i][j - 1]);
                    dp[i][j] = dp[i - 1][j];
                }
            }
        }
        return dp[tl][sl] == sl;
    }
}

2)双指针:时间复杂度O(N)

class Solution {
    public boolean isSubsequence(String s, String t) {
        int sl = s.length();//s短
        int tl = t.length();
        int i = 0,j = 0;
        while(i < sl && j < tl){
            if(s.charAt(i) == t.charAt(j)){//此时相同
                i++;//可以比较下一个字符;
                //比较短的,是每一个字符都要比较的
            }
            j++;//不管相不相同,长的都要往后挪,相当于删掉了该字符
        }
        return i == sl;
    }
}

相关文章:

  • Python面向对象编程
  • java计算机毕业设计霍山石斛网站源码+数据库+系统+lw文档+mybatis+运行部署
  • Python文件处理与垃圾回收机制
  • java计算机毕业设计基于MVC框架的在线书店设计源码+数据库+系统+lw文档+mybatis+运行部署
  • 计算机毕业设计springboot+vue基本微信小程序的外卖点餐订餐平台
  • 文件用手机拍照片打印时,打印出来总是有黑阴影,如何去掉黑色阴影打印清晰的图片
  • okhttp3与旧版本okhttp的区别分析
  • 学习C++第二课
  • Java连接池详解
  • 面向对象编程——类与对象(C#)(未写完)
  • 军品研制过程参考标准
  • 开学季,学长带你认识新生活
  • R语言data.table导入数据实战:data.table数据列索引
  • Java 基础三:使用Velocity模板生成 xml
  • 《华为数据之道》总结(上篇)
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • Android框架之Volley
  • golang 发送GET和POST示例
  • Invalidate和postInvalidate的区别
  • Java程序员幽默爆笑锦集
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Mocha测试初探
  • node学习系列之简单文件上传
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • Vue2.x学习三:事件处理生命周期钩子
  • vue-cli在webpack的配置文件探究
  • Xmanager 远程桌面 CentOS 7
  • 读懂package.json -- 依赖管理
  • 机器学习中为什么要做归一化normalization
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 前端学习笔记之观察者模式
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 微服务框架lagom
  • 正则表达式小结
  • elasticsearch-head插件安装
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 选择阿里云数据库HBase版十大理由
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (10)ATF MMU转换表
  • (12)Linux 常见的三种进程状态
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)丶RabbitMQ的六大核心
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (四)鸿鹄云架构一服务注册中心
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)ABI是什么
  • (转)Google的Objective-C编码规范
  • (转)jQuery 基础
  • (转)setTimeout 和 setInterval 的区别
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET下的多线程编程—1-线程机制概述