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;
        }
    }
  • 相关阅读:
    Android 调用已安装市场,进行软件评分的功能实现
    二十六个月Android学习工作总结
    Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1) 错误 解决方案(android-ndk)
    【Android】神奇的android:clipChildren属性
    Android利用setLayoutParams在代码中调整布局(Margin和居中)
    android 使用代码实现 RelativeLayout布局
    Android 布局学习
    Erlang cowboy 处理不规范的client
    HTTP 响应
    把字符串转换为整数
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/11469966.html
Copyright © 2011-2022 走看看