# 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 see your function signature returns achar * or String, please click the reload button to reset your code definition.

//事后Time Limit Exceeded，发现我想多了，M*N的时间复杂度也是不行
//只能KMP啦！

if(haystack==""&& needle=="") return 0;//空串考虑
if(haystack=="") return -1;//空串中查找非空串，肯定报错
if(needle=="") return 0;//子串为空

int i=0;
int j=0;

int hlen=haystack.length();
int nlen=needle.length();
if(nlen>hlen) return -1;

int k=i;
while(i!=hlen && j!=nlen)
{
if(haystack[i+j]==needle[j]) ++j;
else{
j=0;
++i;
}
}
if(j==nlen) return i;
else return -1;


void get_next(string needle,vector<int> &next)//next
{
int nlen=needle.size();
int k=-1,j=0;
next.push_back(-1);
while(j!=nlen)
{
if(k==-1 || needle[k]==needle[j])//-1很巧妙
{
j++;
k++;
if(needle[k]!=needle[j])
next.push_back(k);
else next.push_back(next[k]);
}
else
k=next[k];
}

}
int strStr(string haystack, string needle) {

//只能KMP啦！

if(haystack.empty() && needle.empty()) return 0;
if(haystack.empty()) return -1;
if(needle.empty()) return 0;
vector<int> next;
get_next(needle,next);

int hlen=haystack.size(),nlen=needle.size();
if(hlen<nlen) return -1;
int i=0,j=0,index=0;
while(i<hlen && j<nlen)
{
if(haystack[i]==needle[j])//相等
{
++i;
++j;
}

else
{
index=index+j-next[j];
if(next[j]!=-1)  //判断next[j]是否为-1
j=next[j];     //不是-1，那么j回退到next[j]的位置
else              //否则，j回退到0，i右移
{
i++;
j=0;
}
}

}
if(j==nlen) return index;
else return -1;

}

• 本文已收录于以下专栏：

## Implement strStr() -- LeetCode

• linhuanmars
• 2014年03月02日 06:42
• 19975

## [LeetCode] 028. Implement strStr() (Easy) (C++/Python)

[LeetCode] 028. Implement strStr() (Easy) (C++/Python)
• hcbbt
• 2015年03月06日 15:05
• 2552

## Implement strStr()--leetcode

Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if nee...
• qq_31597573
• 2016年04月18日 11:26
• 376

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

Implement strStr() ： https://leetcode.com/problems/implement-strstr/Returns the index of the first o...
• quzhongxin
• 2015年07月05日 15:29
• 1588

## LeetCode 28 Implement strStr() (C,C++,Java,Python)

Problem: Implement strStr(). Returns the index of the first occurrence of needle in haystack...
• runningtortoises
• 2015年05月12日 11:59
• 1504

## 【LeetCode-面试算法经典-Java实现】【028-Implement strStr() （实现strStr()函数）】

[【028-Implement strStr() （实现strStr()函数）】](028-Implement strStr() （实现strStr()函数）)【LeetCode-面试算法经典-Jav...
• DERRANTCM
• 2015年07月25日 08:08
• 2752

## [LeetCode][Java] Implement strStr()

• Evan123mg
• 2015年07月10日 20:43
• 882

## Implement strstr()

Implement strstr()问题实现strstr(). 返回needle(关键字)在haystack(字符串)中第一次出现的位置，如果needle不在haystack中，则返回-1。 注：s...
• Jeffery1982
• 2015年02月23日 15:22
• 6655

## leetcode笔记：Implement strStr()

• liyuefeilong
• 2015年10月09日 23:40
• 1301

## LeetCode 28 — Implement strStr()（C++ Java Python）

• dragon_dream
• 2014年04月14日 09:26
• 3222

举报原因： 您举报文章：Implement strStr() 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)