@[TOC](实现 strStr())
1>题目描述
-
实现 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() 定义相符。
2>暴力算法(第一想法)
- 简单地说,遍历需要被寻找的字符串如果碰到寻找字符串的头字符,便把寻找字符串长度的字符串在被寻找字符串中截取出来比对。
2.1、代码实现
class Solution {
public int strStr(String haystack, String needle) {
int i = 0;
String s = "";
if(haystack.equals(needle)){
return 0;
}
while(i+needle.length()<haystack.length()+1){
s = haystack.substring(i,i+needle.length());
if(s.equals(needle)){
return i;
}
i++;
}
return -1;
}
}
3>KMP算法
3.1、算法思路
- 1、首先对needle字符串寻找部分匹配表
- 2、只对haystack遍历一次,通过部分匹配表修改needle此时的遍历位置来达到KMP算法
3.2、代码实现
class Solution {
public int strStr(String haystack, String needle) {
if(needle.equals("")){
return 0;
}
int[] next = new int[needle.length()];
kmpNext(needle,next);
int j = 0;
for(int i=0;i<haystack.length();i++){
while(j>0&&haystack.charAt(i)!=needle.charAt(j)){
j = next[j-1];
}
if(haystack.charAt(i) == needle.charAt(j)){
j++;
}
if (j == needle.length()) { // 找到了
return i - j + 1;
}
}
return -1;
}
public void kmpNext(String needle,int[] next){
next[0] = 0;
for(int i=1,j=0;i<needle.length();i++){
while(j>0&&needle.charAt(j)!=needle.charAt(i)){
j = next[j-1];
}
if(needle.charAt(j) == needle.charAt(i)){
j++;
}
next[i] = j;
}
}
}