实现 strStr()

题目描述:实现 strStr() 函数。

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。

示例说明请见LeetCode官网。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/implement-strstr/

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

解法一:穷举法
  • 首先,如果needle为空,直接返回0;如果 haystack 为空 或者 haystack 的长度 小于 needle 的长度,直接返回-1;
  • 否则,从 haystack 的第一位开始跟 needle 进行匹配,如果匹配不上,则往后继续遍历haystack,直到遍历完成,就能得到结果。

说明:该方法效率比较差。

解法二:KMP算法

首先,构造一个next数组,先计算出下一次跳转的位置,然后遍历按照next数组的位置将原串和匹配串进行匹配。

import com.google.common.base.Strings;

public class LeetCode_028 {
/**
* 穷举法
*
* @param haystack
* @param needle
* @return
*/
public static int strStr(String haystack, String needle) {
if (needle == null || needle.length() == 0) {
return 0;
}
if (haystack == null || haystack.length() == 0 || haystack.length() < needle.length()) {
return -1;
}
int first = 0;
while (first < haystack.length()) {
int matchCount = 0;
for (int i = 0; i < needle.length() && (i + first) < haystack.length(); i++) {
if (needle.charAt(i) == haystack.charAt(i + first)) {
matchCount++;
} else {
break;
}
}
if (matchCount == needle.length()) {
return first;
} else {
first++;
}
}
return -1;
} /**
* KMP算法
*
* @param haystack 原串
* @param needle 匹配串
* @return
*/
public static int strStr2(String haystack, String needle) {
if (Strings.isNullOrEmpty(needle)) {
return 0;
}
// 分别获取原串和匹配串的长度
int haystackLength = haystack.length(), needleLength = needle.length();
// 原串和匹配串前面都加一个空格,使其下标从1开始
haystack = " " + haystack;
needle = " " + needle; char[] haystackList = haystack.toCharArray();
char[] needleList = needle.toCharArray(); // 构建 next 数组,数组长度为匹配串的长度(next 数组是和匹配串相关的)
int[] next = new int[needleLength + 1];
// 构造过程 i = 2, j = 0 开始,i 小于等于匹配串长度【构造 i 从 2 开始】
for (int i = 2, j = 0; i <= needleLength; i++) {
// 匹配不成功的话,j = next[j]
while (j > 0 && needleList[i] != needleList[j + 1]) {
j = next[j];
}
// 匹配成功的话,先让 j++
if (needleList[i] == needleList[j + 1]) {
j++;
}
// 更新 next[i],结束本次循环, i++
next[i] = j;
} // 匹配过程,i = 1, j = 0 开始,i 小于等于原串长度【匹配 i 从 1 开始】
for (int i = 1, j = 0; i <= haystackLength; i++) {
// 匹配不成功 j = next[j]
while (j > 0 && haystackList[i] != needleList[j + 1]) {
j = next[j];
}
// 匹配成功的话,先让 j++,结束本次循环后 i++
if (haystackList[i] == needleList[j + 1]) {
j++;
}
// 整一段都匹配成功,直接返回下标
if (j == needleLength) {
return i - needleLength;
}
} return -1;
} public static void main(String[] args) {
System.out.println(strStr("mississippi", "issi")); System.out.println(strStr2("mississippi", "issi"));
}
}

【每日寄语】 在最美的年华,做最喜欢的事情,别辜负了美好时光,借时光之手,暖一处花开,借一方晴空,拥抱梦想。

最新文章

  1. where 子句中使用通配符
  2. MVC之前的那点事儿系列(6):动态注册HttpModule
  3. ffmpeg iOS 编译
  4. OpenCV Mat 类型定义和赋值
  5. Mysql常用操作记录
  6. CentOS 6.4 使用YUM 安装MySQL5.5
  7. Windows下动态库的隐式调用
  8. webdynpro tree控件使用
  9. 2017-3-2 C#基础 结构体
  10. js字符串与数组的相互转换
  11. python基础教程——函数
  12. postgres 9.5 FDW变化
  13. [LaTeX] box algorithm adjustbox subfigures, textwidth
  14. 2017 Gartner数据科学魔力象限出炉,16位上榜公司花落谁家?
  15. 大受喜欢安卓触控一体机连接云端数据化管理提供例程DEMO
  16. day13 Python数据基本类型
  17. .NET Core中的性能测试工具BenchmarkDotnet
  18. Ubuntu 终端关机和重启命令
  19. 一、使用官方工具建立空springboot
  20. python绘制中文词云图

热门文章

  1. .NET 7 预览版来啦,我升级体验了
  2. STS中创建 javaweb 项目?
  3. makefile快速入门
  4. JVM学习八-(复习)年轻代、老年代、永久代
  5. Posix 信号
  6. 使用python实现冒泡排序和快速排序
  7. ELK、ELFK企业级日志分析系统
  8. uos系统离线状态下进入开发者模式
  9. python小白记录二 ——自动化测试selenium中配置浏览器
  10. suging闲谈-netty 的异步非阻塞IO线程与业务线程分离