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;
        }
    }
  • 相关阅读:
    LeetCode "Median of Two Sorted Arrays"
    LeetCode "Distinct Subsequences"
    LeetCode "Permutation Sequence"

    LeetCode "Linked List Cycle II"
    LeetCode "Best Time to Buy and Sell Stock III"
    LeetCode "4Sum"
    LeetCode "3Sum closest"
    LeetCode "3Sum"
    LeetCode "Container With Most Water"
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/11469966.html
Copyright © 2011-2022 走看看