实现 strStr() 函数。(来源力扣)
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = “hello”, needle = “ll”
输出: 2
方法一:
//在hatstack字符串上每次截取needle长度的字符串比较,暴力破解,借助String的subString(beginIndex,endIndex)和equals()方法
public int strStr(String haystack, String needle) {
int nLen= needle.length();
int hLen = haystack.length();
for (int i = 0; i < hLen - nLen + 1; i++) {
if (haystack.substring(i, i + nLen).equals(needle)) {
return i;
}
}
return -1;
}
方法二:
public int strStr(String haystack, String needle) {
if(needle.length()==0){
return 0;
}
int[] next=new int[needle.length()];
getNext(next,needle);
int j=-1;
for(int i=0;i<haystack.length();i++){
while(j>=0&&haystack.charAt(i)!=needle.charAt(j+1)){
j=next[j];//出现文本串与模式串不等匹配时回退
}
if(haystack.charAt(i)==needle.charAt(j+1)){
j++;//向前比较两字符串
}
if(j==(needle.length()-1)){
return (i-needle.length()+1);
}
}
return -1;
}
//i表示后缀的末尾,j表示前缀的末尾,同时表示最长相等匹配长度
void getNext(int[] next,String s){
int j=-1;
next[0]=j;//next[]数组下标从-1开始
for(int i=1;i<s.length();i++){
//处理前后缀不相等的情况
while(j>=0&&s.charAt(i)!=s.charAt(j+1)){
j=next[j];//向前回退
}
//处理前后缀相等的情况
if(s.charAt(i)==s.charAt(j+1)){
j++;
}
next[i]=j;
}
}