LeetCode算法-实现strStr()
题目描述
给你两个字符串 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()相关推荐
- LeetCode算法入门- Implement strStr() -day22
LeetCode算法入门- Implement strStr() -day22 题目描述 Implement strStr(). Return the index of the first occur ...
- 【To Do】LeetCode 28. Implement strStr() 和KMP算法
LeetCode 28. Implement strStr() Solution1:我的答案 有投机取巧之嫌啊~ 注意string中的查找函数在查找时 参考网址:https://www.cnblogs ...
- LeetCode算法题整理(200题左右)
目录 前言 一.树(17) 1.1.后序遍历 1.2.层次遍历 1.3.中序 1.4.前序 二.回溯(20) 2.1.普通回溯 2.2.线性回溯:组合.排列.子集.分割 2.3.矩阵回溯 三.二分查找 ...
- 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 ...
- LeetCode算法,每日一题,冲击字节跳动
目录 1.LeetCode 20.有效的括号 题目 小编菜解 思路及算法 大神解法 2.LeetCode 26.删除有序数组中的重复项 题目 小编菜解初版 小编菜解改进版 思路及算法 大神解法 3.L ...
- 腾讯T3整理分享的LeetCode算法小抄完整文档
前言 本文⽬前可以⼿把⼿带你解决 110 道 LeetCode 算法问题,⽽且在不断更新,全部基于 LeetCode 的题⽬,涵盖了所有题型和技巧. 目录 主要内容 ⽬前已包含的 114 道题⽬教程如 ...
- leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!
作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...
- LeetCode算法题-Nth Digit(Java实现)
这是悦乐书的第215次更新,第228篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第83题(顺位题号是400).找到无限整数序列的第n个数字1,2,3,4,5,6,7,8 ...
- LeetCode算法题-Reverse Linked List(Java实现)
这是悦乐书的第192次更新,第195篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第51题(顺位题号是206).反转单链表.例如: 输入:1-> 2-> 3- ...
最新文章
- BZOJ3488 : [ONTAK2010]Highways
- python能做什么游戏好-Python有做大型游戏的潜力吗?
- OGEngine_粒子效果
- C# System.Windows.Forms.NumericUpDown 控件全选其中文字
- 设计模式-Singleton
- (BFS)Catch That Cow(poj3278)
- 数据结构期末复习之选择排序
- [下载]北京新版小学英语五年级上册mp3点读APP
- win10 查看系统开机历史记录
- JS 绘制 Cardinal 样条曲线
- 【精华】多目标跟踪MOT
- CTF Web出题感悟
- Javaweb阶段学习
- 监听浏览器返回,可清除历史记录(移动端:手势返回)(vue)
- ESP定律脱压缩壳aspack
- 李理:自动梯度求解——使用自动求导实现多层神经网络
- 格拉姆矩阵 Gram Matrix 简单理解
- Linux系统信息收集
- vue知识点详解,Vue之v-prev、vue-virtual-scroll-list、alise、data动态添加数据、v-for中的key值等
- 生产作业指导书怎么写?企业如何编制生产作业指导书?
热门文章
- 大一计算机课程excel,大学计算机EXCEL讲课ppt课件.ppt
- android notification点击无效,Notification.addAction在Android O中无效
- easyui ajax获取表单数据,easyui提交form表单接受数据处理、
- c语言程序设计家庭收支类,家庭支出管理系统—c语言程序设计
- Java中的executeQuery,java连接数据库executeUpdate() 和executeQuery()
- 简单的Java秒表计时器(线程),Java计时器使功能每分钟运行
- iphone11看信号强度_iPhone11信号怎么样_iPhone11信号差原因|解决办法-太平洋IT百科...
- 想知道聊天室系统是怎么做的吗?
- 用谷歌搜索技术问题一定比用百度好?也未必...
- 阿里巴巴Json工具:Fastjson教程