【LeetCode】Implement strStr()

Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
题目意思很简单:两个字符串haystack和needle,返回字符串needle在haystack中第一次出现的位置,不存在返回-1。
我采用比较简单直观的方法,先在haystack中找到一个与needle第一个字符相等的字符。然后开始比较此字符其后的字符是否与needle对应相等,是即返回第一个字符位置,否则继续上述流程,寻找第一个满足的字符。注意几个边界条件:字符串为空,haystack长度大于needle。代码如下:

public int strStr(String haystack, String needle) {

        int haystackLength = haystack.length();
        int needleLength = needle.length();
        if(haystack == null || needle == null) {
            return -1;
        }
        if(haystackLength < needleLength) {
            return -1;
        }
        if(haystackLength == needleLength) {
            if(haystack.equals(needle)) {
                return 0;
            } else {
                return -1;
            }
        }
        if(needleLength == 0) {
            return 0;
        }

        int haystackIndex = 0;
        int needleIndex = 0;
        int temp = 0;
        while(haystackIndex < haystackLength) {
            if(haystack.charAt(haystackIndex) == needle.charAt(0)) {//寻找第一位相等的
                temp = haystackIndex;//记录每次找到的第一个相等的字符位置
                while(needleIndex < needleLength && haystackIndex < haystackLength && //&&左右两边不要颠倒,否则可能出现数组下标越界,,因为到最后haystackIndex还会++
                        haystack.charAt(haystackIndex) == needle.charAt(needleIndex)) {
                    haystackIndex++;
                    needleIndex++;
                }
                if(needleIndex == needleLength) {
                    return (haystackIndex - needleIndex);//比较完毕,和needle的最后一位都相同
                } else {
                    needleIndex = 0;//中间有不相同的,不满足条件,置零,重新比较
                    haystackIndex = temp+1;//从下一位开始继续找
                }
            } else {
                haystackIndex++;//第一位不相等,右移继续找
            }

        }
        return -1;   
    }

另外,还有一个代码比较简洁的版本,思路基本类似:

public int strStr(String haystack, String needle) {
        for (int i = 0;; i++) {
            for (int j = 0;; j++) {
                if (j == needle.length())
                    return i;
                if (i + j == haystack.length())
                    return -1;
                if (needle.charAt(j) != haystack.charAt(i + j))
                    break;
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值