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;
        }
    }
  • 相关阅读:
    如何在Ubuntu上安装配置和使用Docker
    在Ubuntu 20.04 LTS Focal Fossa上安装Netdata Monitoring
    CG-CTF 480小时精通C++
    IDA 动态调试
    CG-CTF 签到
    CG-CTF WxyVM
    buu 达芬奇 && ROT
    buu firmware
    buu [MRCTF2020]keyboard
    buu signin
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/11469966.html
Copyright © 2011-2022 走看看