题目

392. Is Subsequence
Given a string s and a string t, check if s is subsequence of t.

A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, “ace” is a subsequence of “abcde” while “aec” is not).

Follow up:

If there are lots of incoming S, say S1, S2, … , Sk where k >= 1B, and you want to check one by one to see if T has its subsequence. In this scenario, how would you change your code?

Credits:

Special thanks to @pbrother for adding this problem and creating all test cases.

Example 1:

Input: s = "abc", t = "ahbgdc"
Output: true

Example 2:

Input: s = "axc", t = "ahbgdc"
Output: false

Constraints:

  1. 0 <= s.length <= 100
  2. 0 <= t.length <= 10^4
  3. Both strings consists only of lowercase characters.

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/is-subsequence

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一

解决思路:笔者看这道题是二分查找的类型题,很自然就从二分查找,用左右两个坐标同时来匹配。短字符串s的左坐标为sleft, 右坐标为sright; 长字符串t的左坐标为tleft, 右坐标为tright.

检查边界问题,比如短字符为空s == null || s.length() == 0, 则直接返回true;如果长字符为空t == null || t.length() == 0,则直接返回false;

循环遍历条件为长字符串tleft <= tright , 在循环结束前tleft++; tright–;。

如果短字符串的左边字符等于长字符串的左边字符串,则sleft++;;如果短字符串的右边字符等于长字符串的右边字符串,则sright–;。

在结束前判断短字符串的sleft > sright,则返回true。 注意:笔者这里踩过坑,如果放到最前面判断,有可能,长字符串也结束了,导致结果还是false。

public boolean isSubsequence(String s, String t) {// check edge for sif (s == null || s.length() == 0) {return true;}// check edge for tif (t == null || t.length() == 0) {return false;}boolean result = false;int sleft = 0;int sright = s.length() - 1;int tleft = 0;int tright = t.length() - 1;while (tleft <= tright) {if (s.charAt(sleft) == t.charAt(tleft)) {sleft++;}if (s.charAt(sright) == t.charAt(tright)) {sright--;}if (sleft > sright) {return  true;}tleft++;tright--;}return result;}

解法二

笔者跑完以后,以为速度会是最快了,看了以后只能超过87%的提交。看了一下评论,发现还有更优解。

解题思路如下:

遍历短字符串的所有字符,比如遍历到短字符的c,如果长字符集能从前一个找到的字符的位置加一(第一个字符的初始值为-1),能找到当前字符c,则返回第一次找到该字符的位置,则替换index为上一个找到的字符集;如果没有找到当前字符c,则结果是-1,如果是-1,则直接返回false。时间复杂度只有最短字符的长度,最快的情况下,如果第一个字符都没找到就直接退出。神来之笔。

public boolean isSubsequenceByIndexOfChar(String s, String t) {int index = -1;for (char c: s.toCharArray()) {index = t.indexOf(c, index + 1);if (index == -1) {return false;}}return true;}

算法:还有比二分查找更快的算法,判断是否是子字符串Is Subsequence相关推荐

  1. 基于二分查找的抽签游戏算法的优化

    基于二分查找的抽签游戏算法的优化 问题描述: 一个袋子里有n个纸片,纸片上有数字,你随机取出4张纸(有放回),若四张纸的数字和为m,你就赢了,否则你就输了.连续试了几次后你都失败了,于是你想知道到底有 ...

  2. 二分检索用途及复杂性_二分查找和三分查找哪个快?算法复杂度与常数无关?复杂度分析的常见误区...

    还记得两三年前,我初看一本算法书,看到二分查找算法的复杂度时,我发现了了不得的东西:二分查找每次查询范围减少一半,需要查询的次数是 ,它的复杂度是 . 我把它改成三分查找,每次查询两个数字与我的目标数 ...

  3. java 二分搜索获得大于目标数的第一位_程序员数据结构算法编程,二分查找搜索算法的原理与应用介绍!...

    本文来讲一种搜索算法,即二分搜索算法,通常在面试时也会被问到. 我们先来看一个例子,在图书馆通常是根据查到的编号去找书,可以在书架上按顺序一本本地查找,也可以找到一本书不符合预期时,再跳过一大部分书再 ...

  4. 大前端算法入门之二分查找

    现如今面试大厂的前端岗位对于应聘者的算法技巧要求越来越高,现在的前端已经不仅仅是制作页面就能够交差的,所以掌握算法技巧是很重要的,下面小千就来给大家介绍一个二分查找算法. 二分查找 所谓的算法都不是直 ...

  5. 算法(一):二分查找法

    算法基础: 一.大O表示法: 指示算法的速度有多快,用于指出随数量的增大,算法的所需步骤增加的速度,常见的大O运行时间(时间复杂度): O(1)表示常数阶时间复杂度 O(log n),也叫对数时间复杂 ...

  6. 《算法图解》——二分查找

    1    二分查找(从中间元素开始查找)的速度比简单查找快的多. 2    O(logn)比O(n)快.需要搜索的元素越多,前者比后者就快得越多. 3    算法运行时间并不以秒为单位. 4    算 ...

  7. Leetcode中几道二分查找(Binary Search)的算法题总结

    二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列.二分查找法的时间复杂度是对数级别的,O(lo ...

  8. python实现二分查找_数据结构和算法:Python实现二分查找(Binary_search)

    在一个列表当中我们可以进行线性查找也可以进行二分查找,即通过不同的方法找到我们想要的数字,线性查找即按照数字从列表里一个一个从左向右查找,找到之后程序停下.而二分查找的效率往往会比线性查找更高. 一. ...

  9. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

  10. 二分查找 归并排序 快排 详解C++

    这三个排序算法一直是面试的重点,大多数都是C语言写的,今天整理了一下C++的写法,思想都差不多.这几个排序经常忘记,今天抽空记在这,以便自己以后查阅,不对的地方,也欢迎大家评论,不吝指正,谢谢! 二分 ...

最新文章

  1. k8s入门系列之介绍篇
  2. 何为Java 中的多态?
  3. 华为笔记本matebook13_为什么我不推荐华为Matebook 13给职场新人/小白?
  4. 控制机械手叫什么_用意念控制机械手臂?世界上第一个半机械人即将诞生!
  5. 嵌套中断共享资源问题及解决
  6. Java集合框架(3)
  7. linux shell 嵌套expect 与服务器交互脚本
  8. python rpc webservice_PythonXMLRPC服务器端和客户端实例
  9. 在深圳待不下去了,换个大城市就好了嘛
  10. 入门教程:.NET开源OpenID Connect 和OAuth解决方案IdentityServer v3 介绍 (一)
  11. Linux 迅雷 chrome插件,Chrome(Chromium)迅雷下载支持扩展1.1测试版【更新】
  12. java jre 32位_jre 1.8 32位
  13. EXCEL表格超链接图片
  14. 如何生成王者荣耀、QQ飞车等游戏“空白名”、“重复名”等特殊名
  15. lg-1 x 怎么算_纯爱|电竞新文《队友太会撒娇了怎么办》《转会后我成了团宠》...
  16. 星界边境机器人升级,星界边境作弊码分享
  17. 2019年肖秀荣命题人精讲精练
  18. iPhone/iPad苹果设备型号对应常用名称列表(2022更新至iPhone 14 Pro Max | iPad Air 5)
  19. PHP调用外部程序的方法解析
  20. 手机电池为什么会爆炸

热门文章

  1. prometheus linux下载_Prometheus笔记
  2. linux配置环境变量宏,在linux中配置环境变量(示例代码)
  3. mysql5.7.17启动失败_解决Mysql5.7.17在windows下安装启动时提示不成功问题
  4. 【转】el-table复选框分页记忆-非:reserve-selection=true模式
  5. .Net4.0的网站在IE10、IE11出现“__doPostBack未定义”的解决办法
  6. 大规模机器学习:将数据科学引入生产系统架构的典型模式
  7. 硅谷初创企业控制成本 裁员风渐起
  8. Tomcat(一):基础配置详解
  9. ssl自签名证书生成脚本
  10. cisco的路由器上rip的被动接口,单播更新,水平分隔