前记:本为个人学习记录有不对请指出,谢谢
示例题目
调用方法
面试官:出去记得把门带上
很简单调用String类的方法找到第一次出现的位置
public class Solution {
public int strStr(String haystack, String needle) {
return haystack.indexOf(needle);
}
}
朴素算法
暴力解决一切问题,看我两重循环,哈哈嗝
public class Solution {
public int strStr(String haystack, String needle) {
int n=haystack.length();
int m=needle.length();
char a[]=haystack.toCharArray();
char b[]=needle.toCharArray();
int index=0;
for(int i=0;i<n;i++){
index=i;
for(int j=0;j<m;j++){
if(index>=n||a[index++]!=b[j]){
break;
}
if(j==m-1){
return i;
}
}
}
return -1;
}
}
KMP算法
首先我们来探讨一下什么前缀串和后缀串
这个算法就是比较当下字符串的前缀和后缀是否有相同
下面我们来利用这个前后缀来看一下next数组
下面用具体示例来就一个next数组
void get_next(String s){
int n=s.length();
char a[]=(s).toCharArray();//是为了使数组从1开始
int next[]=new int[n];
for(int i=1,j=0;i<n;i++){
while(j>0&&a[i]!=a[j]){
j=next[j-1];
}
if(a[i]==a[j]){
j++;
}
next[i]=j;
}
for(int i=0;i<n;i++){
System.out.println(next[i]);
}
}
完整代码
class Solution {
public int strStr(String haystack, String needle) {
if(needle.isEmpty()){
return 0;
}
int n=haystack.length();
int m=needle.length();
char a[]=haystack.toCharArray();
char b[]=needle.toCharArray();
int next[]=new int[m];
for(int i=1,j=0;i<m;i++){
while(j>0&&b[i]!=b[j]){
j=next[j-1];
}
if(b[i]==b[j]){
j++;
}
next[i]=j;
}
for(int i=0,j=0;i<n;i++){
while(j>0&&a[i]!=b[j]){
j=next[j-1];
}
if(a[i]==b[j]){
j++;
}
if(j==m){
return i-m+1;
}
}
return -1;
}
}