每日一道算法题009 实现 strStr()

312 阅读2分钟

题目

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() 定义相符。

做题时间

class Solution {
    public int strStr(String haystack, String needle) {



    }
}

以上给出方法输入参数,完成作答。

题目分析

  1. 本题是对比两个字符串,然后返回起始位置值
  2. 我的解题思路还是用两个指针的方式,分别指向两个字符串
  3. 然后分别对比两个字符串在两个指针对应的位置字符是否相同
  4. 相同则继续,否则重置指针位置

解答分析

本文只分析本人做题思路,仅供参考,了解一种解题思想,其他各种做题思路请上网查阅。

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:36.9 MB,击败了80.77% 的Java用户

class Solution {
    public int strStr(String haystack, String needle) {
        if (needle == null || needle.length() == 0) {//判断特殊情况直接返回 0
            return 0;
        }
        if (!haystack.contains(needle)) { //判断如果不包含,直接返回 -1
            return -1;
        } else {
            int i = 0; //此指针指向 needle 指针 
            for (int j = 0; j < haystack.length(); j++) { //此指针指向 haystack 字符串
                if (needle.charAt(i) == haystack.charAt(j)) { //如果两个指针位置字符相同,则指针均后移
                    i++;
                    if (i >= needle.length()) { //如果指针位置超出 needle 长度,则直接返回
                        return j - needle.length() + 1;
                    }
                } else { //如果两指针位置字符不同,则重置两指针位置
                    j = j - i; // j 恢复到上次比较的下一个位置
                    i = 0; // i 恢复到初始位置
                }
            }
            return -1;
        }
    }
}