leetcode 28. 实现 strStr()

399 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目描述

实现 strStr() 函数。

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回  -1 。

说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。

示例 1:

输入:haystack = "hello", needle = "ll"
输出:2

示例 2:

输入:haystack = "aaaaa", needle = "bba"
输出:-1

示例 3:

输入:haystack = "", needle = ""
输出:0

提示

0 <= haystack.length, needle.length <= 5 * 104 haystack 和 needle 仅由小写英文字符组成

思考过程

进行匹配,可以使用双指针进行判断.

当开始匹配时,左指针和右指针同时进行移动匹配下一个字符是否相等

当匹配途中失败,需要返回到开始匹配的位置,因此需要记录起始位置.

当匹配失败分成两种情况: 1.不处于匹配阶段,左指针移动

2.处于匹配阶段: 左指针返回到起始位置+1,右指针置0;

题解

1.先进行特殊判断,当右字符串为空时,返回0

2.用左右指针进行比较判断.

2.1 当指针相等时,进入匹配阶段.

2.1.1 匹配阶段标识符置为1,记录匹配的起始位置,左右指针同时向前移动

2.1.2 判断右指针是否超过字符串长度,当超过时,代表全部匹配,返回起始位置

2.2 指针不相等时

2.2.1 处于匹配阶段:匹配结束,标识符置为0.左指针回到起始位置,右指针置为0

2.2.2 不处于匹配阶段,左指针继续移动

3.循环结束,返回-1,没有找到匹配结果.

public static int strStr(String haystack, String needle) {
        // 当needle为空字符串时,返回0
        if (0 == needle.length()) {
            return 0;
        }
        char[] chars = haystack.toCharArray();
        char[] chars1 = needle.toCharArray();
        int left = 0;
        int right = 0;
        // 记录本次匹配相等的起始位置
        int leftTemp = 0;
        // 用于标记是否处于匹配相等阶段
        int flag = 0;
        while (left < haystack.length() && right < needle.length()) {
            // 相等,进行下一个判断.
            if (chars[left] == chars1[right]) {
                // 当已标记时,不用更新起始位置
                if (flag == 0) {
                    leftTemp = left;
                }
                flag = 1;
                left ++;
                right ++;
                
            }
            // 不相等分两种情况,
            else {
                //当前处于相等匹配阶段时,需要将右指针置0,左指针变成第一次相等的位置+1
                if (flag == 1) {
                    flag = 0;
                    left = leftTemp + 1;
                    right = 0;
                }
                else {
                    left ++;
                }
            }
        }
        // 当超过右字符串长度,匹配完成,返回起始位置
        if (right == needle.length()) {
            return leftTemp;
        }
        return -1;
    }

image.png