leecode刷题(17)-- 实现StrStr
leecode刷题(17)-- 实现StrStr
实现StrStr
描述:
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:
输入: haystack = "aaaaa", needle = "bba"
输出: -1
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
思路:
这道题的原意是让我们的用自己的算法实现 strStr()函数,但我发现使用 indexOf() 是真的快啊 (捂脸)。算了,还是不用这个函数了,我们来自己实现,我想到的只有暴力遍历两个字符串,依次比较是否相等。还有一种是KMP算法,但是自己看的不是很懂,这里就不列出来了。
说下过程(暴力遍历):
首先先做判断,如果子字符串是空字符串,那么我们返回 0 。如果子字符串长度大于母字符串,那么我们返回 -1。然后遍历母字符串,不需要遍历整个母字符串,我们只需要遍历到剩下的长度和子字符串相等就好了,提高运算效率。然后对于母字符串的每一个字符,我们再遍历子字符串,一个一个字符对应比较,如果对应位置有不相等的,则跳出循环。如果一直没有跳出循环,则说明比较的字符是相等的,也即子字符串能和母字符串位置对应,这时我们返回起始位置就可以了。
代码如下:
public class StrStr {
public int strStr(String haystack, String needle) {
if (needle.length == 0) return 0;
int m = haystack.length(), n = needle.length();
if (m < n) return -1;
for (int i = 0; i <= m - n; i++) {
int j = 0;
for (j = 0; j < n; j++) {
if (haystack.charAt(i + j) != needle.charAt(j)) break;
}
if (j == n) return i;
}
return -1;
}
}
再说一下使用 indexOf() 的方法:
代码如下:
class Solution {
public int strStr(String haystack, String needle) {
return haystack.indexOf(needle);
}
}
这个函数是真的又快又简单。
leecode刷题(17)-- 实现StrStr的更多相关文章
- leecode刷题(22)-- 反转数组
leecode刷题(22)-- 反转数组 反转数组 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3-> ...
- leecode刷题(21)-- 删除链表的倒数第N个节点
leecode刷题(21)-- 删除链表的倒数第N个节点 删除链表的倒数第N个节点 描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2- ...
- leecode刷题(20)-- 删除链表中的节点
leecode刷题(20)-- 删除链表中的节点 删除链表中的节点 描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = ...
- leecode刷题(19)-- 最长公共前缀
leecode刷题(19)-- 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...
- leecode刷题(18)-- 报数
leecode刷题(18)-- 报数 报数 描述: 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1. 1 2. 11 3. 21 4. 1211 5. 1112 ...
- leecode刷题(16)-- 字符串转换整数
leecode刷题(16)-- 字符串转换整数 字符串转换整数 描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格 ...
- leecode刷题(15)-- 验证回文字符串
leecode刷题(15)-- 验证回文字符串 验证回文字符串 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 ...
- leecode刷题(14)-- 有效的字母异位词
leecode刷题(14)-- 有效的字母异位词 有效的字母异位词 描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 示例 1: 输入: s = " ...
- leecode刷题(13) -- 字符串中的第一个唯一字符
leecode刷题(13) -- 字符串中的第一个唯一字符 字符串中的第一个唯一字符 描述: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = & ...
随机推荐
- U3D 如何计算一个UI四个角的绝对坐标
//方式一,使用API获取 var rtrans = gameObject.GetComponent<RectTransform>(); Vector3[] worldcorners ...
- Elasticsearch 2.4.1 Bigdesk 插件安装
简介: Elasticsearch 2.4.1 安装 bigdesk bigdesk 是一个 ES 集群监控工具,可以检测到集群状态.各节点信息,包括 JVM.Thread Pools.OS.Proc ...
- 03-SSH综合案例:商城表关系分析
1.2 设计页面: 静态页面: 1.3 数据库分析与设计: 一般是一个Java类就对应一个表,有哪些类?那看你有哪些实体啊?一般一个模块对应一个实体 有用户模块就会有用户的一个实体,就会有用 ...
- Python 入门学习(壹)上机时间提醒
基于 Udacity 的 Python 入门课程 Programming Foundations with Python 基于 Python 2.7 控制台版本 思路 Project 1 是一个时间提 ...
- 286被围绕的区域 · Surrounded Regions
[抄题]: 给一个二维的矩阵,包含 'X' 和 'O', 找到所有被 'X' 围绕的区域,并用 'X' 填充满. 样例 给出二维矩阵: X X X X X O O X X X O X X O X X ...
- rabbitmq 和Spring 集成 实现(一)
1.增加pom.xml依赖 <!--rabbitmq消息队列依赖架包--> <dependency> <groupId>org.springframework.am ...
- promise、resolve、reject、拦截响应
Promise是一个接口,它用来处理的对象具有这样的特点:在未来某一时刻(主要是异步调用)会从服务端返回或者被填充属性.其核心是,promise是一个带有then()函数的对象. 使用promise机 ...
- java 对象直接序列化
序列化类,加字段后, 使用该类从现有文件反序列化时,以前字段可以正常读出 但是反序列化后,那些未对应字段会被设置成null ,即使在类的定义种已设置了初始值 --------------------- ...
- 百度地图point 转化成经纬度
百度1.0表示的坐标点,直接在1.3的api上使用坐标无法定位,研究了一阵子百度拾取坐标系统的源码才知道,原来1.0的point是Pixel,调用js的转化代码就搞定了 转化方法如下: var b = ...
- ScreenCapture手动卸载教程-Xproer.ScreenCapture
此教程包含WindowsXP,Windows7(x86) ,Windows7(x64),Firefox,Chrome卸载教程. 1.1. 手动卸载控件-Windows XP 主要步骤如下: 1.关闭所 ...