算法系列:实现strStr函数(字符串)

boyanx15小时前技术教程1

28. 实现 strStr()


描述

  • 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
  • 对于本题而言,当 needle 是空字符串时我们应当返回 0

示例 1

    输入: haystack = "hello", needle = "ll"
    输出: 2

示例 2

    输入: haystack = "aaaaa", needle = "bba"
    输出: -1

思路 1

  • 使用js提供的indexOf

解法 1

/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function(haystack, needle) {
   return haystack.indexOf(needle)
};

思路 2

  • 遍历截取字符串对比,从匹配字符串 haystack 中截取出与需查找字符串 needle 长度相等的内容后,对比截取的内容与匹配字符串是否相等,如果相等返回开始截取的下标。
  • 1.needle 的长度为0,直接返回0
  • 2.needle 的字符串长度大于 haystack,肯定不匹配
  • 3.needle 的字符串长度等于 haystack,判断是否相等,相等则匹配否则不匹配
  • 4.剩下的就是 needle 字符串长度小于 haystack 的情况,遍历 haystack.在遍历中判断 将要截取的字符串的首位与 needle 字符串的首位是否相同 ,如果不相同也就不需要后续截取、比较,跳过该次循环

代码 2

/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function(haystack, needle) {
   const haystackLen = haystack.length;
   const needleLen = needle.length;

    // needle字符串为空的情况,返回0
   if(!needle){
       return 0;
       // needle字符串长度大于haystack字符串长度,肯定不匹配
   }else if(needleLen>haystackLen){
       return -1;
       // needle字符串长度等于haystack字符串长度,则直接比较两个字符是否一样即可
   }else if(needleLen === haystackLen){
       return haystack === needle ? 0 : -1;
   }else{
       // needle字符串长度小于haystack字符串长度,遍历开始;
       for(let i =0;i<haystackLen-needleLen;i++){
           // 如果haystack字符的每一项 都不等于 needle的第一项,则肯定不匹配
           if(haystack[i] !== needle[0]){
               continue;
           }
            // 从haystack截取和needle长度一样的字符,和needle比较是否一样
           if(haystack.substring(i,i+needleLen) === needle){
               return i;
           }
       }
   }
   return -1;
};

复杂度分析 2

  • 时间复杂度:O(n)遍历长度可能从 1 到 n -1n-1,假设不同长度出现的概率均等,那么时间复杂度为 (n-1 + 1) / 2(n-1+1)/2时间复杂度即为O(n)
  • 空间复杂度:O(1)使用 2 个额外存储空间。

思路 3

  • 双层循环对比字符;从匹配字符串 haystack 的不同位置开始遍历,判断其中是否含有查找字符串 needle。
    如:haystack 为 hello, needle 为 ll,依次判断 he、el、ll、lo是否完全和 ll 相等,相等即返回对应字符串在 haystack 中的下标。
  • 1.边界情况处理
  • 2.设置最外层循环,遍历次数为 0 - haystack长度减去 needle 的长度。剩余字符串长度小于 needle 长度时,肯定不匹配
  • 3.判断匹配字符串 haystack 中该次循环使用到的字符串首尾字母是否与查找字符串 needle 首尾字母相同。不相等,直接跳过继续遍历。相等,执行第4步。
  • 4.判断查找字符串 needle 的长度长度为 1,表明匹配成功,直接返回当前长字符串下标即可长度大于 1,执行第5步
  • 5.遍历对比字符串,循环判断匹配字符串 haystack 不同位置的字符是否与匹配字符串 needle 对应位置的字符相等不相等时,跳出循环,进行下次循环。到最后一位还未跳出循环表明完全匹配,返回当前遍历次数(即查找字符串在匹配字符串中首次出现的位置)

代码 3

const strStr = function (haystack, needle) {
  const hayLen = haystack.length;
  const nedLen = needle.length;

  if (!needle) {
    return 0;
  } if (nedLen > hayLen) {
    return -1;
  } else if (nedLen === hayLen) {
    return haystack === needle ? 0 : -1;
  } else {
    for (let hasIndex = 0; hasIndex <= hayLen - nedLen; hasIndex++) {
      if (
        haystack[hasIndex] === needle[0] &&
          haystack[hasIndex + nedLen - 1] === needle[nedLen - 1]
      ) {
        if (nedLen === 1) {
          return hasIndex;
        }
        for (let nedIndex = 1; nedIndex < nedLen; nedIndex++) {
          if (haystack[hasIndex + nedIndex] !== needle[nedIndex]) {
            break;
          }
          if (nedIndex === nedLen - 1) {
            return hasIndex;
          }
        }
      }
    }
  }
  return -1;
};

复杂度分析 3

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)


如果文章对您有帮助,感谢关注和转发,让更多的人看到,一起传递知识!

相关文章

Java中你知道几种从字符串中找指定的字符的数量

遇到这样的问题,常规的思路估计就是遍历String,然后逐个对比。下面先看循环遍历循环遍历private static int getNum(String originStr, String targ...

Python 中 字符串处理的高效方法,不允许你还不知道

以下是 Python 中 字符串处理的高效方法,涵盖常用操作、性能优化技巧和实际应用场景,帮助您写出更简洁、更快速的代码:一、基础高效操作1.字符串拼接:优先用join()代替+原因:join() 预...

刘心向学(37)__repr__ 与 __str__:深入理解对象的字符串表示

分享兴趣,传播快乐, 增长见闻,留下美好! 亲爱的您,这里是LearningYard新学苑。 今天小编为大家带来文章 “刘心向学(37):__repr__ 与 __str__:深入理解对象的字符串表示...

【西门子】关于从S7-1200字符串中提取有效数值

PLC从上位机或智能设备读取到一组杂乱无章的字符数据,比如"A,1;22=333,5678,E.909" ,需要从这个字符串中把有用的数字提取出来(只提取数字,舍弃字母及标点),需要...

AI 编码史诗级翻车现场!刚刚,Replit 一键删光客户整个生产数据库,官方连夜补锅

整理|冬梅策划|Tina1 网友痛斥 Replit AI 失控,删除了他们整个数据库昨夜,一位 X ID 名为 Jason 的用户发帖痛斥开发协作平台 Replit 在数据库事故处理中的混乱表现,引发...

Python字符串终极指南!单引号、双引号、三引号区别全解析

导语: Python中字符串(str)是最核心的数据类型!无论你是输出"Hello World"还是处理用户数据,都离不开它。今天彻底讲清字符串的三大定义方式及其核心区别,新手必看!一...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。