• [算法]实现strStr()


    题目

    实现 strStr() 函数。

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

    示例 1:

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

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/implement-strstr
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路

    两种解法。

    第一种:暴力直接求解,时间复杂度是O(n^2)。

    第二种:Rabin-Karp算法。

    时间复杂度O(m + n)。

    代码

    代码1

    class Solution {
        public int strStr(String haystack, String needle) {
            if(haystack == null || needle == null) return -1;
            for(int i=0; i < haystack.length() - needle.length() + 1; i++){
                int j = 0;
                for(; j < needle.length(); j++){
                    if(haystack.charAt(i + j) != needle.charAt(j)) break;
                }
                if(j == needle.length()) return i;
            }
            return -1;
        }
    }

    代码2

    class Solution {
        static final int BASE = 1000000;
        public int strStr(String haystack, String needle) {
            if(haystack == null || needle == null) return -1;
            if(needle.length() == 0) return 0;
    
            int m = needle.length();
            //31 ^ m
            int power = 1;
            for (int i = 0; i < m; i++) {
                power = (power * 31) % BASE;
            }
    
            int targetCode = 0;
            for (int i = 0; i < m; i++) {
                targetCode = (targetCode * 31 + needle.charAt(i)) % BASE;
            }
    
            int hashCode = 0;
            for (int i = 0; i < haystack.length(); i++) {
                hashCode = (hashCode * 31 + haystack.charAt(i)) % BASE;
                if(i < m - 1){
                    continue;
                }
    
                //减去开始的数 abcd - a
                if(i >= m) {
                    hashCode = hashCode - (haystack.charAt(i - m) * power) % BASE;
                    if(hashCode < 0){
                        hashCode += BASE;
                    }
                }
    
                //双重校验
                if(hashCode == targetCode){
                    if(haystack.substring(i - m + 1, i + 1).equals(needle)){
                        return i - m + 1;
                    }
                }
            }
    
            return -1;
        }
    }
  • 相关阅读:
    五大主流浏览器 CSS3 和 HTML5 兼容性大比拼
    httpservice 公共类
    Eclipse自动生成注释
    天生一对"Maven2+Jetty" Maven2创建并管理WebApp,并使用Maven Jetty Plugin在Eclipse中调试
    jsp checkbox不错的应用
    我们需要改变
    Sortable Table 可排序表格JS收集
    Eclipse快捷键大全()
    Ajax简单应用
    css 固定table表头
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/11469966.html
Copyright © 2020-2023  润新知