题目描述

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

说明:

当 needle 是空字符串时,我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

示例 1:

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

示例 2:

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

示例 3:

输入:haystack = "", needle = ""
输出:0

提示:

  • 0 <= haystack.length, needle.length <= 5 * 104

  • haystack 和 needle 仅由小写英文字符组成

题目思路

我们采取暴力破解法,让我们的needle字符串与haystack的所有长度为needle长度的子串进行挨个的匹配,如果匹配成功,返回当前的下标,如果匹配都不成功,返回-1。如果haystack字符串的剩余长度小于needle字符串,则不用进行匹配,直接返回-1。

Java实现方案

public int strStr(String haystack, String needle) {if (needle.length() == 0) {return 0;}int sourceLength = haystack.length();int targetLength = needle.length();int result = -1;for (int i = 0; i + targetLength <= sourceLength; i++) {boolean flag = true;for (int j = 0; j < targetLength; j++) {if (needle.charAt(j) != haystack.charAt(i + j)) {flag = false;break;}}if (flag) {result = i;break;}}return result;}

代码详细解析

由题目详情可知,如果needle字符串为空,我们要返回0。所以我们先对这种特殊情况进行一次处理,于是有了一下三行的代码。

if (needle.length() == 0) {return 0;
}

小伙伴们,也许会问,如果我不处理,由下面的代码进行统一处理呢,那么一定是返回-1的,不符合题意,所以我们选择先行处理一次。

接下来,我们要获取两个字符串的长度,已经定义一个返回值,返回值我们默认为-1。因为除了上述情况外,其他所有不符合的情况都应该返回-1。于是有了下面的三行代码。

int sourceLength = haystack.length();
int targetLength = needle.length();
int result = -1;

接下来是我们的重头戏,遍历子串。我们先来看一眼for循环的条件。

for (int i = 0; i + targetLength <= sourceLength; i++) {}

我们定义一个下标初始的值为0,代表我们从haystack字符串的第一个字符开始进行对比。循环的条件是i + targetLength <= sourceLength。为什么是<=呢,因为我们要考虑的就是两个字符串长度相等的情况。比如a和a做比较,两个字符串的长度都为1。如果我们选择了<。那么0+1 < 1 这是不成立的。直接就会跳出循环,返回-1。而我们的正确结果是匹配成功应该返回0。所以我们在此进行匹配的时候,要选择<=。

有些小伙伴会考虑另一个问题,单看这个循环,如果i真的达到了等于的条件,那么不会产生数组越界吗?答案是不会的。因为我们下面的break判断会直接跳出当前的循环。

最后看下我们循环体里面的主代码逻辑

boolean flag = true;
for (int j = 0; j < targetLength; j++) {if (needle.charAt(j) != haystack.charAt(i + j)) {flag = false;break;}
}
if (flag) {result = i;break;
}

我们先设置一个flag 为true,他的意义代表,我们完全找到了这个子串,每次进入循环,我们都要重新置这个状态,因为我们是暴力破解,每次子串对比的状态一定要重置。

接下来开始遍历needle字符串。从第一个字符开始,因为随着我们的needle字符串,向后变更,haystack字符串也要同样的向后变更,所以haystack字符串为i+j作为下标。一旦有一个不一致,我们置flag为false然后跳出循环,当我们的needle字符串全部遍历完毕,而且没有跳出循环,此时的flag为true的话,那么i就是我们要找到的下表,直接跳出父循环,返回result即可。

总结

以上就是这道题的全部思路,欢迎大家在评论区进行探讨。

LeetCode算法-实现strStr()相关推荐

  1. LeetCode算法入门- Implement strStr() -day22

    LeetCode算法入门- Implement strStr() -day22 题目描述 Implement strStr(). Return the index of the first occur ...

  2. 【To Do】LeetCode 28. Implement strStr() 和KMP算法

    LeetCode 28. Implement strStr() Solution1:我的答案 有投机取巧之嫌啊~ 注意string中的查找函数在查找时 参考网址:https://www.cnblogs ...

  3. LeetCode算法题整理(200题左右)

    目录 前言 一.树(17) 1.1.后序遍历 1.2.层次遍历 1.3.中序 1.4.前序 二.回溯(20) 2.1.普通回溯 2.2.线性回溯:组合.排列.子集.分割 2.3.矩阵回溯 三.二分查找 ...

  4. LeetCode算法刷题目录 (Java)

    目录 1.数学基础 1.1.位运算 1.2.其它 2.数据结构 2.1.线性表 2.1.1.数组(双指针) 2.1.2.链表(双指针) 2.1.3.栈 2.1.4.队列 2.1.5.字符串 2.1.6 ...

  5. LeetCode算法,每日一题,冲击字节跳动

    目录 1.LeetCode 20.有效的括号 题目 小编菜解 思路及算法 大神解法 2.LeetCode 26.删除有序数组中的重复项 题目 小编菜解初版 小编菜解改进版 思路及算法 大神解法 3.L ...

  6. 腾讯T3整理分享的LeetCode算法小抄完整文档

    前言 本文⽬前可以⼿把⼿带你解决 110 道 LeetCode 算法问题,⽽且在不断更新,全部基于 LeetCode 的题⽬,涵盖了所有题型和技巧. 目录 主要内容 ⽬前已包含的 114 道题⽬教程如 ...

  7. leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!

    作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...

  8. LeetCode算法题-Nth Digit(Java实现)

    这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...

  9. LeetCode算法题-Reverse Linked List(Java实现)

    这是悦乐书的第192次更新,第195篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第51题(顺位题号是206).反转单链表.例如: 输入:1-> 2-> 3- ...

最新文章

  1. BZOJ3488 : [ONTAK2010]Highways
  2. python能做什么游戏好-Python有做大型游戏的潜力吗?
  3. OGEngine_粒子效果
  4. C# System.Windows.Forms.NumericUpDown 控件全选其中文字
  5. 设计模式-Singleton
  6. (BFS)Catch That Cow(poj3278)
  7. 数据结构期末复习之选择排序
  8. [下载]北京新版小学英语五年级上册mp3点读APP
  9. win10 查看系统开机历史记录
  10. JS 绘制 Cardinal 样条曲线
  11. 【精华】多目标跟踪MOT
  12. CTF Web出题感悟
  13. Javaweb阶段学习
  14. 监听浏览器返回,可清除历史记录(移动端:手势返回)(vue)
  15. ESP定律脱压缩壳aspack
  16. 李理:自动梯度求解——使用自动求导实现多层神经网络
  17. 格拉姆矩阵 Gram Matrix 简单理解
  18. Linux系统信息收集
  19. vue知识点详解,Vue之v-prev、vue-virtual-scroll-list、alise、data动态添加数据、v-for中的key值等
  20. 生产作业指导书怎么写?企业如何编制生产作业指导书?

热门文章

  1. 大一计算机课程excel,大学计算机EXCEL讲课ppt课件.ppt
  2. android notification点击无效,Notification.addAction在Android O中无效
  3. easyui ajax获取表单数据,easyui提交form表单接受数据处理、
  4. c语言程序设计家庭收支类,家庭支出管理系统—c语言程序设计
  5. Java中的executeQuery,java连接数据库executeUpdate() 和executeQuery()
  6. 简单的Java秒表计时器(线程),Java计时器使功能每分钟运行
  7. iphone11看信号强度_iPhone11信号怎么样_iPhone11信号差原因|解决办法-太平洋IT百科...
  8. 想知道聊天室系统是怎么做的吗?
  9. 用谷歌搜索技术问题一定比用百度好?也未必...
  10. 阿里巴巴Json工具:Fastjson教程