zoukankan      html  css  js  c++  java
  • [算法]实现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;
        }
    }
  • 相关阅读:
    Oracle 数据块,文件块转换,查看数据块对像
    逆向与汇编视频(36课) IDA 使用
    VC++消息钩子编程
    VS2008中opengl配置
    BSP技术详解3有图有真相
    BSP技术详解1有图有真相
    oracle 跟踪文件和转储命令
    BSP技术详解2有图有真相
    Recognizing and Learning Object Categories 连接放送
    自学MVC看这里——全网最全ASP.NET MVC 教程汇总
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/11469966.html
Copyright © 2011-2022 走看看