实现 strStr() 函数
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = “hello”, needle = “ll”
输出: 2
示例 2:输入: haystack = “aaaaa”, needle = “bba”
输出: -1作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnr003/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
方法一:substring()
package _2020_07_08;
public class 实现strStr {
public static void main(String[] args) {
String s1 = "aaaaa", s2 = "bba";
System.out.println(strStr(s1,s2));
System.out.println(strStr2(s1,s2));
}
public static int strStr(String s1, String s2) {
int n = s1.length();
int L = s2.length();
for(int start = 0 ; start < n - L + 1 ; ++start){
//substring()取一段字符串
if(s1.substring(start,start + L).equals(s2)){
return start;
}
}
return -1;
}
}
方法二:双指针 - 线性时间复杂度
public static int strStr2(String haystack, String needle) {
int L = needle.length(); //要匹配
int n = haystack.length();
if(L == 0) return 0;
int pn = 0;
while(pn < n - L + 1){
//判断第一个字母是否相等,如不等,haystack 下标移位
while(pn < n - L + 1 && haystack.charAt(pn) != needle.charAt(0)){
++pn;
}
int currLen = 0;
int pL = 0;
//如两字母相等就同时移位
while(pL < L && pn < n && haystack.charAt(pn) == needle.charAt(pL)){
++pn;
++pL;
++currLen; //计数
}
//长度和 L 相等,说明成功找到,pn(找到的最后一个相等字母) - L(匹配长度)
if(currLen == L) return pn - L;
pn = pn - currLen + 1; //回溯
}
return -1;