Implement strStr()

Description:

Implement strStr().

Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

问题描述

在源字符串中找目标字符串,如果有,返回第一次出现的首字母索引,否则返回-1..

解法一:

思路:

来个暴搜解法。。。

Code:

public class Solution {
    public int strStr(String haystack, String needle) {
        if (needle == null || haystack == null){
            return -1;
        }
        if (needle.equals("")){
            return 0;
        }
        int l = needle.length();
        for (int i = 0; i <= haystack.length() - l; i++){
            if (haystack.substring(i,i+l).equals(needle)){
                return i;
            }
        }
        return -1;
    }
}

解法二:

思路:

Robin-Karp算法,用Hash函数

Code:

public class Solution {
    public int strStr(String haystack, String needle) {
        int BASE = 1000000;
        if (haystack == null || needle == null){
            return -1;
        }
        int m = needle.length();
        if (m == 0){
            return 0;
        }

        //31^m
        int power = 1;
        for (int i = 0; i < m; i++){
            power = (power * 31) % BASE;
        }

        int needleCode = 0;
        for (int i = 0; i < m; i++){
            needleCode = (needleCode * 31 + needle.charAt(i)) % BASE;
        }

        int hashCode = 0;
        for (int i = 0; i < haystack.length(); i++){
            //abc + d
            hashCode = (hashCode * 31 + haystack.charAt(i)) % BASE;
            if (i < m - 1){
                continue;
            }

            //i
            //abcd - a
            if (i >= m){
                hashCode = hashCode - (haystack.charAt(i - m) * power) % BASE;
                if (hashCode < 0){
                    hashCode += BASE;
                }
            }

            //double check the string
            if (hashCode == needleCode){
                if (haystack.substring(i - m + 1, i + 1).equals(needle))
                return i - m + 1;
            }
        }
        return -1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值