码迷,mamicode.com
首页 > 其他好文 > 详细

【LeetCode】28.实现strStr()

时间:2020-08-31 13:31:21      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:意义   从后往前   ret   min   token   pre   from   als   arc   

题目链接

28. 实现 strStr()

题目描述

实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

示例 1:
输入: haystack = "hello", needle = "ll"
输出: 2

示例 2:
输入: haystack = "aaaaa", needle = "bba"
输出: -1

解题思路

1.Java内置函数

2.BF暴力法

3.滑动窗口

利用substring函数从haystack依次截取与needle字符串相同长度的字符串,两者进行比较即可

4.KMP算法

KMP算法的核心就在于求解模式串的最长公共前后缀,且next数组中next[0]=-1,next[1]=0是确定的,next数组的意义在于当模式串当前字符与匹配串不匹配时,next数组值就是模式串指针的下一个位置,而不是和暴力方法一样,每次都从头开始!

学会KMP算法,就没有遗憾了

「天勤公开课」KMP算法易懂版

KMP算法Next数组讲解

AC代码

1.Java内置函数

String haystack = "hellowordllo";
String needle = "llo";
System.out.println(haystack.lastIndexOf(needle));//9
System.out.println(haystack.indexOf(needle));//2
System.out.println(haystack.indexOf(needle,3));//9
a.indexOf(String s) //从字符串a开始从前往后找到第一个与字符s匹配的子串,找到就返回匹配的子串的下标,否则返回-1
a.indexOf(String s,int Fromindex)//从字符串a第Fromidnex个元素开始从前往后找到第一个与字符s匹配的子串,找到就返回匹配的子串的下标,否则返回-1
a.lastIndexOf(String s)//从后往前找

2.BF暴力法(超时)

class Solution {
    public int strStr(String haystack, String needle) {
        if(haystack.equals(needle)) return 0;
        if(haystack.length() < needle.length()) return -1;
        for(int i = 0; i < haystack.length(); i++){
            int index = i;
            int cnt = 0;
            for(int j = 0; j < needle.length(); j++){
                if(index < haystack.length() && needle.charAt(j) == haystack.charAt(index)){
                    index++;
                    cnt++;
                }
                else break;
            }
            if(cnt == needle.length()) return i;
        }
        return -1;
    }
}

3.滑动窗口

class Solution {
    public int strStr(String haystack, String needle) {
        if(haystack.equals(needle)) return 0;
        if(haystack.length() < needle.length()) return -1;
        int h_len = haystack.length();
        int n_len = needle.length();
        for(int i = 0; i <= h_len-n_len; i++){
            String s = haystack.substring(i,i+n_len);
            if(s.equals(needle)) return i;
        }
        return -1;
    }
}

4.KMP算法

//KMP算法的核心在于求解next数组

class Solution {

    int[] getnext(String needle){
        int[] next = new int[needle.length()];
        next[0] = -1;
        int l = -1;
        int index = 0;
        while(index < needle.length() - 1){
            if(l == -1 || needle.charAt(l) == needle.charAt(index)){
                l++;
                index++;
                next[index] = l;
            }else l = next[l];
        }
        return next;
    }

    public int strStr(String haystack, String needle) {
        if(haystack.length() == 0 && needle.length() == 0) return 0;
        if(haystack.length() == 0) return -1;
        if(needle.length() == 0) return 0;
        int h_len = haystack.length();
        int n_len = needle.length();
        int h_index = 0;
        int n_index = 0;
        int[] next = getnext(needle);
        while(h_index < h_len){
            if(haystack.charAt(h_index) == needle.charAt(n_index)){
                h_index++;
                n_index++;
            }else{
                if(n_index == 0){//两个字符串首个元素不同,那匹配串指针肯定要加1呀
                    h_index++;
                }else{
                    n_index = next[n_index];
                }
            }
			//当模式串指针到模式串末尾,证明匹配成功
            if(n_index == needle.length()) return h_index-n_index;
        }
        return -1;
    }
}

【LeetCode】28.实现strStr()

标签:意义   从后往前   ret   min   token   pre   from   als   arc   

原文地址:https://www.cnblogs.com/XDU-Lakers/p/13562350.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!