【一天一道LeetCode】#28. Implement strStr()
一天一道LeetCode系列
(一)题目
Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
(二)解题
第一种解法:朴素匹配算法
/*
两个指针,分别指向两个字符串的首字符
如果相等则一起向后移动,如果不同i取第一个相同字符的下一个开始继续匹配
如果最后j等于needle的长度则匹配成功,返回i-j
否则返回0
*/
class Solution {
public:
int strStr(string haystack, string needle) {
int j,i;
for(i = 0 , j =0 ; i<haystack.length() && j < needle.length() ;)
{
if(i+needle.length()>haystack.length()) return -1;
if(haystack[i]==needle[j]){//如果匹配上就继续向后匹配
i++;
j++;
}
else{
i-=j-1;//回溯到匹配开始时needle的首字符对应的下一位
j=0;//j回溯到needle的首字符
}
}
if(j==needle.length()) return i-j;
else return -1;
}
};
第二种解法:KMP模式匹配算法
关于kmp,请自行百度或者大话数据结构P143页
class Solution {
public:
int strStr(string haystack, string needle) {
int hlen = haystack.length();
int nlen = needle.length();
if(hlen==0) return nlen==0?0:-1;//临界值判断
if(nlen==0) return 0;//needle为NULL,就直接返回0
int* next = new int[nlen+1];
getNext(needle,next);
int i = 0;
int j = 0;
while(i<hlen&&j<nlen){
if(j==-1 || haystack[i]==needle[j]){
i++;j++;
}
else j=next[j];
}
if(j==nlen) return i-j;//等于nlen代表匹配成功,返回i-j即needle首字符在haystack中的位置
else return -1;
}
void getNext(string& needle,int next[])
{
int i = 0;
int j = -1;
next[0] = -1;
while(i<needle.length()){
if(j==-1 || needle[i]==needle[j]){
i++;
j++;
if(needle[i] == needle[j]) next[i] = next[j];//kmp优化,防止aaaaab和aaaac前四位的无效
else next[i] = j;
}
else
j=next[j];
}
}
};
【一天一道LeetCode】#28. Implement strStr()的更多相关文章
- 44. leetcode 28. Implement strStr()
28. Implement strStr() Implement strStr(). Returns the index of the first occurrence of needle in ha ...
- [LeetCode] 28. Implement strStr() 实现strStr()函数
Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...
- Leetcode #28. Implement strStr()
Brute Force算法,时间复杂度 O(mn) def strStr(haystack, needle): m = len(haystack) n = len(needle) if n == 0: ...
- Java [leetcode 28]Implement strStr()
题目描述: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ...
- [LeetCode] 28. Implement strStr() 解题思路
Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...
- Leetcode 28——Implement strStr()
Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...
- [leetcode]28. Implement strStr()实现strStr()
Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...
- [LeetCode] 28. Implement strStr() ☆
Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...
- LeetCode 28 Implement strStr() (实现找子串函数)
题目链接: https://leetcode.com/problems/implement-strstr/?tab=Description Problem : 实现找子串的操作:如果没有找到则返回 ...
- LeetCode——28. Implement strStr()
题目: class Solution { public: int strStr(string haystack, string needle) { if(needle.empty()){ return ...
随机推荐
- android JNI的.so库调用
在一篇博客中看到一篇文章,感觉描述的还可以: 在前面的博客中介绍的都是使用java开发Android应用,这篇博客将介绍java通过使用jni调用c语言做开发 为了更加形象的介绍jni,先观察下面的图 ...
- Udemy上免费的angualr2视频教程分享
福利大分享 本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/52592518 一晚上听了10几节课程,整体感觉很不错的 ...
- 《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文
NMF(非负矩阵分解),由于其分解出的矩阵是非负的,在一些实际问题中具有非常好的解释,因此用途很广.在此,我给大家介绍一下NMF在多声部音乐中的应用.要翻译的论文是利用NMF转录多声部音乐的开山之作, ...
- Linux-2.6.25 TCPIP函数调用大致流程
插口层系统调用send sys_send sys_sendtosendto sys_sendto sock_sendmsgsendmsg sys_send ...
- MPAndroidChart图形联动
MPAndroidChart图形联动 本篇基于博客MPAndroidChart的K线图上添加均线,两个MPAndroidChart是有联动效果的 原理 获取正在滑动的Chart的触摸事件,将事件同步给 ...
- ExpandableListView的使用
ExpandableListView的使用 效果图 布局 <ExpandableListView android:id="@+id/expandableListView" a ...
- logstash输出到elasticsearch多索引
目标:将json格式的两类日志输出到elasticsearch两类索引 1. 安装logstash. 2. 编写logstash处理配置文件,创建一个test.conf文件,内容如下: input { ...
- Java基础之枚举妙用
对于枚举,初学Java的时候可能我们就已经接触过了,但是在毕业前,其实一直都不知道真正工作里面枚举是怎么用的,枚举有什么用?接下来,博主就介绍枚举在实际工作中的一种使用场景,本文只适合初级的小菜鸟看哈 ...
- C/C++与Matlab混合编程初探
================================================================== % 欢迎转载,尊重原创,所以转载请注明出处. % http://b ...
- Gradle 的Daemon配置
最近升级到Android 2.2.2之后,运行之前的项目特别卡,基本上2分钟,好的时候1分半,查询了Android官网的说明说daemon能够加快编译.于是我也尝试开启Daemon. 在Windows ...