头图

LeetCode-028-实现 strStr()

实现 strStr()

题目描述:实现 strStr() 函数。

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

示例说明请见LeetCode官网。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:穷举法
  • 首先,如果needle为空,直接返回0;如果 haystack 为空 或者 haystack 的长度 小于 needle 的长度,直接返回-1;
  • 否则,从 haystack 的第一位开始跟 needle 进行匹配,如果匹配不上,则往后继续遍历haystack,直到遍历完成,就能得到结果。

说明:该方法效率比较差。

解法二:KMP算法
首先,构造一个next数组,先计算出下一次跳转的位置,然后遍历按照next数组的位置将原串和匹配串进行匹配。
import com.google.common.base.Strings;

public class LeetCode_028 {
    /**
     * 穷举法
     *
     * @param haystack
     * @param needle
     * @return
     */
    public static int strStr(String haystack, String needle) {
        if (needle == null || needle.length() == 0) {
            return 0;
        }
        if (haystack == null || haystack.length() == 0 || haystack.length() < needle.length()) {
            return -1;
        }
        int first = 0;
        while (first < haystack.length()) {
            int matchCount = 0;
            for (int i = 0; i < needle.length() && (i + first) < haystack.length(); i++) {
                if (needle.charAt(i) == haystack.charAt(i + first)) {
                    matchCount++;
                } else {
                    break;
                }
            }
            if (matchCount == needle.length()) {
                return first;
            } else {
                first++;
            }
        }
        return -1;
    }

    /**
     * KMP算法
     *
     * @param haystack 原串
     * @param needle   匹配串
     * @return
     */
    public static int strStr2(String haystack, String needle) {
        if (Strings.isNullOrEmpty(needle)) {
            return 0;
        }
        // 分别获取原串和匹配串的长度
        int haystackLength = haystack.length(), needleLength = needle.length();
        // 原串和匹配串前面都加一个空格,使其下标从1开始
        haystack = " " + haystack;
        needle = " " + needle;

        char[] haystackList = haystack.toCharArray();
        char[] needleList = needle.toCharArray();

        // 构建 next 数组,数组长度为匹配串的长度(next 数组是和匹配串相关的)
        int[] next = new int[needleLength + 1];
        // 构造过程 i = 2, j = 0 开始,i 小于等于匹配串长度【构造 i 从 2 开始】
        for (int i = 2, j = 0; i <= needleLength; i++) {
            // 匹配不成功的话,j = next[j]
            while (j > 0 && needleList[i] != needleList[j + 1]) {
                j = next[j];
            }
            // 匹配成功的话,先让 j++
            if (needleList[i] == needleList[j + 1]) {
                j++;
            }
            // 更新 next[i],结束本次循环, i++
            next[i] = j;
        }

        // 匹配过程,i = 1, j = 0 开始,i 小于等于原串长度【匹配 i 从 1 开始】
        for (int i = 1, j = 0; i <= haystackLength; i++) {
            // 匹配不成功 j = next[j]
            while (j > 0 && haystackList[i] != needleList[j + 1]) {
                j = next[j];
            }
            // 匹配成功的话,先让 j++,结束本次循环后 i++
            if (haystackList[i] == needleList[j + 1]) {
                j++;
            }
            // 整一段都匹配成功,直接返回下标
            if (j == needleLength) {
                return i - needleLength;
            }
        }

        return -1;
    }

    public static void main(String[] args) {
        System.out.println(strStr("mississippi", "issi"));

        System.out.println(strStr2("mississippi", "issi"));
    }
}
【每日寄语】 在最美的年华,做最喜欢的事情,别辜负了美好时光,借时光之手,暖一处花开,借一方晴空,拥抱梦想。

LeetCodet题解
技术学习

玉树临风,仙姿佚貌!

1.8k 声望
7.1k 粉丝
0 条评论
推荐阅读
牛客网高频算法题系列-BM19-寻找峰值
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于假设 nums[-1] = nums...

雄狮虎豹阅读 355

封面图
Java 编译器 javac 及 Lombok 实现原理解析
javac 是 Java 代码的编译器12,初学 Java 的时候就应该接触过。本文整理一些 javac 相关的高级用法。Lombok 库,大家平常一直在使用,但可能并不知道实现原理解析,其实 Lombok 实现上依赖的是 Java 编译器的注...

nullwy10阅读 6k

与RabbitMQ有关的一些知识
工作中用过一段时间的Kafka,不过主要还是RabbitMQ用的多一些。今天主要来讲讲与RabbitMQ相关的一些知识。一些基本概念,以及实际使用场景及一些注意事项。

lpe2348阅读 1.8k

封面图
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go5阅读 2k评论 2

封面图
Redis 发布订阅模式:原理拆解并实现一个消息队列
“65 哥,如果你交了个漂亮小姐姐做女朋友,你会通过什么方式将这个消息广而告之给你的微信好友?““那不得拍点女朋友的美照 + 亲密照弄一个九宫格图文消息在朋友圈发布大肆宣传,暴击单身狗。”像这种 65 哥通过朋...

码哥字节6阅读 1.2k

封面图
NB的Github项目,看到最后一个我惊呆了!
最近看到不少好玩的、实用的 Github 项目,就来给大家推荐一把。中国制霸生成器最近在朋友圈非常火的一个小网站,可以在线标记 居住、短居、游玩、出差、路过 标记后可生成图片进行社区分享,标记过的信息会记录...

艾小仙5阅读 1.5k评论 1

好好的系统,为什么要分库分表?
今天是《分库分表 ShardingSphere 原理与实战》系列的开篇文章,之前写过几篇关于分库分表的文章反响都还不错,到现在公众号:程序员小富后台不断的有人留言、咨询分库分表的问题,我也没想到大家对于分库分表的话...

程序员小富3阅读 1.5k

玉树临风,仙姿佚貌!

1.8k 声望
7.1k 粉丝
宣传栏