【LeetCode】28 实现strSTR()

实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置
(从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = “hello”, needle = “ll” 输出: 2
示例 2:
输入: haystack = “aaaaa”, needle = “bba” 输出: -1
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf()定义相符。


解题要点:
1 此题目的就是让你实现java中的indexOf。(看到提交中3ms、4ms的直接返回indexOf…emmmm我就当是在测试吧
2 这道题也做了两遍,第一次用简单粗暴的双重循环,第二次阅读了indexOf源码并实现了它。然而,重点是,这两次提交的结果速度相差只有1ms,刷到现在我才发现,其实leetcode的重点是实现而不是速度,回馈给你的用时只是为了让你知道不要让你的程序耗太~ 长~时间,还有帮助你剔除有问题的代码。

解题思路:
双重循环的思路应该不用说了,把indexOf的思路讲一下吧
1 日常处理异常数据,如needle字符串为""(此处回顾一下JAVA中String为null和"“的区别:null是指没有这个对象,就是“我们村没有老王这个人,也没有老王的房子”;而”"是指“我们村老王的房子在村西口,但是我们从来没见过他,他连个逗号也不是”)则返回0。
2 找到needle字符串第一个字符,对haystack遍历找到与此字符相同的字符位置,用i记录下来
3 在此i处向后遍历,比较两个字符串对应位置的元素,如果最后比较结束还未跳出循环,则返回该i
4 若在i处未找到答案,继续对haystack进行遍历

实现indexOf的代码:

class Solution {
    public int strStr(String haystack, String needle) {
        Integer result = -1;
        
        char[] hay = haystack.toCharArray();
        char[] nee = needle.toCharArray();
                
        if(nee.length == 0)
            return 0;
        
        char first = nee[0];
        int max = hay.length - nee.length;
        
        for (int i = 0;i <= max;i++){
            
            if (hay[i] != first){
                while (++i<=max && hay[i] != first);
            }
            
            if (i <= max){
                int j = i + 1;
                int end = j + nee.length - 1;
                
                for (int k = 1; j < end && hay[j] == nee[k];j++,k++);
                
                if (j == end){
                    return i;
                }
            }
        }
        return result;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36269372/article/details/83621391