题目描述:
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
示例 1:
输入:haystack = “hello”, needle = “ll”
输出:2
示例 2:
输入:haystack = “aaaaa”, needle = “bba”
输出:-1
提示:
1 <= haystack.length, needle.length <= 104
haystack 和 needle仅由小写英文字符组成
class Solution {
public int strStr(String str, String subs) {
if(str==null||subs==null)return -1;
if(str.length()==0||subs.length()==0)return -1;
char[] subc=subs.toCharArray(); //将子串转换成字符数组方便计算next数组
int[] next=new int[subc.length]; //声明next数组
getNext(subc,next); //计算next数组
int i=0,j=0; //双指针遍历主串和子串
while(i<str.length()&&j<subs.length()){
if(j==-1||str.charAt(i)==subs.charAt(j)){
i++;j++;
}
else{
j=next[j]; //子串回溯
}
if(j==subs.length()){
return i-j; //返回index下标
}
}
return -1;
}
public void getNext(char[] subc,int[] next){
next[0]=-1; //设置数组第一位为-1
int i=1; //从子串下标为2的位置开始计算
int j=-1; //此时j为next[0]的值
while(i<subc.length){ //遍历子串
if(j==-1||subc[i-1]==subc[j]){ //判断上一个最长公共前缀后的字符是否相等
next[i++]=++j; //最长公共前缀长度加一
}
else{
j=next[j]; //往前递归找上一个最长公共前缀
}
}
}
}