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

找出字符串中第一个匹配项的下标-力扣28-java

一、题目描述

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。

示例 1:

输入:haystack = "sadbutsad", needle = "sad"

输出:0

解释:"sad" 在下标 0 和 6 处匹配。

第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"

输出:-1

解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string

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

二、运行结果

暴力匹配运行结果:

KMP算法运行结果:

三、解题思路

一、暴力匹配:两层循环

二、KMP匹配算法:首先计算匹配串的next数组,然后遍历源串和匹配串进行匹配,当不匹配时,根据next数组进行跳转,源串的指针不用回溯,时间效率更高。

四、AC代码

一、暴力匹配代码

class Solution {public int strStr(String haystack, String needle) {int len1 = haystack.length();int len2 = needle.length();for(int i=0; i<=len1-len2; ++i){for(int j=0; j<len2; ++j){if(j == (len2-1) && needle.charAt(j) == haystack.charAt(i+j))return i;if(needle.charAt(j) != haystack.charAt(i+j))break;}}return -1;}
}

二、KMP算法匹配代码

class Solution {public int strStr(String haystack, String needle) {// KMP匹配算法int len1 = haystack.length();int len2 = needle.length();if(len2 == 0) return 0;//转换为字符数组方便操作char[] hArr = haystack.toCharArray(); char[] nArr = needle.toCharArray(); // 构建next数组(next数组和匹配串相关)int[] next = new int[len2];for(int i=1, j=0; i<len2; i++){while(j > 0 && nArr[i] != nArr[j]) j = next[j-1]; if(nArr[i] == nArr[j]) j++;next[i] = j;}//利用next指针进行跳转,源串的指针不用回溯for(int i=0, j=0; i<len1; i++){while(j > 0 && hArr[i] != nArr[j]) j = next[j-1];if(hArr[i] == nArr[j]) j++;if(j == len2) //匹配串已经在源串中完全找到return i-j+1;}return -1;}
}
http://www.lryc.cn/news/7009.html

相关文章:

  • SpringBoot 监听Redis key过期回调
  • 蓝桥杯C/C++VIP试题每日一练之回形取数
  • 四控、三管、一协调
  • jdk19下载与安装教程(win10)超详细
  • 来来来,手摸手写一个hook
  • 【C++】AVL树
  • Mybatis源码(2) - SqlSessionTemplate的介绍及创建过程
  • 女生做大数据有发展前景吗?
  • Git实用指令记录
  • 复杂美公链技术重要特色:平行公链架构
  • Java——进制转换的一些内容
  • 使用 Nodejs、Express、Postgres、Docker 在 JavaScript 中构建 CRUD Rest API
  • 电子招标采购系统源码之什么是电子招投标系统?
  • 匹配文件名称模块glob和fnmatch
  • day12_oop
  • 在 Flutter 中使用 webview_flutter 4.0 | js 交互
  • 嵌入式ARM工业边缘计算机BL302的CAN总线接口如何设置?
  • Win11系统如何安装Ubuntu20.04(WSL版本)并安装docker
  • Elasticsearch和Solr的区别
  • 如何在北京买房
  • 使用Proxifier+burp抓包总结
  • 安装华为aab包的处理方式
  • Word处理控件Aspose.Words功能演示:使用 C++ 将 RTF 文档转换为 PDF
  • 【Java|多线程与高并发】进程与线程的区别与联系
  • K8s手工创建kubeconfig
  • 【SQL开发实战技巧】系列(十七):时间类型操作(下):确定两个日期之间的工作天数、计算—年中周内各日期出现次数、确定当前记录和下一条记录之间相差的天数
  • 代码随想录算法训练营第二十八天 | 491.递增子序列,46.全排列,47.全排列 II
  • 使用 Three.js 后处理的粗略铅笔画效果
  • 推荐一些不常见的搜索引擎
  • RabbitMQ工作模式