LeetCode: Implement strStr() [027]

【题目】

Implement strStr().

Returns a pointer to the first occurrence of needle in haystack,
or null if needle is not part of haystack.

【题意】

实现库函数strStr(),
功能是在字符串haystack中找出目标串needle第一次出现的索引位

【思路】

字符串的匹配,能够用暴力解法,但不推荐。一般使用KMP算法求解。

简要介绍一下KMP的思想:

haystack是题设所给的匹配串,needle是题设所给的模式串。

needle在和haystack匹配时,假设遇到某个位置上的字符失配,暴力法会将needle的游标返回头部,从头開始又一次匹配;而KMP算法同意游标不返回头部,而利用已有的匹配结果,将游标移动到新的位置k上,从k位置開始匹配。
     
    怎样确定这个新位置,或者说这个新位置是什么呢?
 
 (1).我们这么来看,如果在当前的匹配过程中发现haystack[i]!=needle[j],显然这个时候haystack[i-j,
i-1]和needle[0,j-1]各个位置上的字符已经匹配。
 
 (2).此时,needle新的游标位置next[j]=k,它满足子串needle[0,k-1]与子串needle[j-k,j-1]全然匹配,也就是说字符串needle[0,j-1]的前k个字符与后k个字符同样。【k是满足该匹配条件的最大值,且k<j】

 
 (3)把needle的游标从j移动到k,意味着我们从k開始比較就能够了,needle[0,k-1]不须要再反复比較了。这一点由(1)保证。

结合(1)(2)我们有:haystack[i-j, i-1]=needle[0,j-1] &&
needle[0,k-1]=needle[j-k, j-1]

显然我们能够推出:needle[0,k-1]=haystack[i-k,i-1]; 也即从k位置開始比較就可以,不须要从头開始匹配。

        
    
   
KMP算法关键在于建立next数组,即发生不匹配情况是回跳到哪个位置继续匹配。
   
如果我们已经确定了needle字符串中j位置的字符失配时跳转的位置是k,即next[j]=k,
依据上面的分析我们知道此时满足needle[0,k-1]=needle[j-k, j-1]。那next[j+1]=?
    1.
假设needle[k]==needle[j],显然有needle[0,k]=needle[j-k, j],则next[j+1]=k+1;
 
  2. 假设needle[k]!=needle[j],
这也是一种失配的情况(即needle起始字符串和结尾字符串匹配时发生失配),则游标k应该跳转到next[k],然后再与needle[j]比較,假设还是失配,游标继续通过next数组回跳,直至与needle[j]匹配,此时next[j+1]=k+1;

【代码】

class Solution {
public:
void getNext(char*needle, int*next){
int size=strlen(needle);
int i=0,k=-1;
next[0]=-1;
while(i<size-1){ //由于我们通过A[i]来求A[i+1]的,因此结束条件是i<size-1
if(k==-1||needle[i]==needle[k]){
i++;
k++;
next[i]=k;
}
else{
k=next[k];
}
}
}
char *strStr(char *haystack, char *needle) {
if(needle==NULL || haystack==NULL)return NULL;
int patternSize=strlen(needle);
int haystackSize=strlen(haystack);
int*next=new int[patternSize];
//生成next数组
getNext(needle,next);
//匹配
int i=0; //haystack的游标
int j=0; //needle的游标
while(i<haystackSize&&j<patternSize){
if(j==-1||haystack[i]==needle[j]){
i++;j++;
}
else{
j=next[j];
}
}
delete next;
if(j==patternSize)return haystack+i-j;
return NULL;
}
};

LeetCode: Implement strStr() [027]

时间: 2024-09-30 07:31:22

LeetCode: Implement strStr() [027]的相关文章

[LeetCode] Implement strStr() [18]

题目 Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack. 原题链接(点我) 解题思路 字符串匹配这也是个老题了,方法主要有下面4种, 1. 暴利破解法(BF),这个没啥说的,就是一轮一轮的比较,知道遇到相匹配的,这个的时间复杂度为O(n^2). 2. KMP,这应该是字符串匹配领域中最长听说的算

leetcode | Implement strStr() | 实现字符串查找函数

Implement strStr() : https://leetcode.com/problems/implement-strstr/ Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. 如:haystack = "bcbcda"; needle = "bcd" 则 return 2 解析:字符串查找函数,

LeetCode Implement strStr()

Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. Update (2014-11-02): The signature of the function had been updated to return the index instead of the pointer. If you still

[Leetcode] implement strStr() (C++)

题目: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. Update (2014-11-02):The signature of the function had been updated to return the index instead of the pointer. If you st

leetcode——Implement strStr() 实现字符串匹配函数(AC)

Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack. 这个题考查的是KMP算法.先求特征向量,然后再进行匹配,确实能够大大提高效率.code例如以下: class Solution { public: char *strStr(char *haystack, char *needle) { if(

leetcode implement strStr python

#kmp class Solution(object): def strStr(self, haystack, needle): """ :type haystack: str :type needle: str :rtype: int """ if len(haystack) <= 0 and len(needle)<=0: return 0 arrNext=self.getNext(needle) i=0 j=0 intHLen=

LeetCode Implement strStr() 实现strstr()

如题 思路:暴力就行了.1ms的暴力!!!别的牛人写出来的,我学而抄之~ 1 int strStr(char* haystack, char* needle) { 2 if (!haystack || !needle) return -1; 3 for (int i = 0; ; ++i) { 4 for (int j = 0; ; ++j) { 5 if (needle[j] == 0) return i; 6 if (haystack[i + j] == 0) return -1; 7 if

leetcode Implement strStr()(easy) /java

我以为,当时我用c++写这个函数的时候,整个人如同乱麻. 这次用java写.先查的SE 8中String的方法.找到两个与此函数有关的方法:matches()和substring(). import java.io.*; import java.util.*; public class Solution { public static int strStr(String haystack, String needle) { int r=-1; int len1=haystack.length()

LeetCode 28. Implement strStr()

https://leetcode.com/problems/implement-strstr/ Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack. 字符串简单题.一定要写的没BUG. 如果不在函数最后一行写return语句的话,LeetCode会出RUNTIME ERROR. Line 27: co