LeetCode 28题:找出字符串中第一个匹配项的下标

题目

给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1

示例 1:

复制代码
输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

复制代码
输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

提示:

  • 1 <= haystack.length, needle.length <= 104
  • haystackneedle 仅由小写英文字符组成

Python

看到这道题的一瞬间,我就想到了Python中的find()函数,所以很快就写好了:

python 复制代码
class Solution(object):
    def strStr(self, haystack, needle):
            return haystack.find(needle) 
  
A=Solution()
haystack ="sadbutsad"
needle ="sad"
print(A.strStr(haystack,needle))

这样虽然简单,但数据不是很好:


C语言

cs 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int strStr(char * haystack, char * needle);

int main()
{
    char* haystack ="sadbutsad";
    char* needle ="sad";
    printf("%d",strStr(haystack,needle));
    return 0;
}


//主要函数
int strStr(char * haystack, char * needle)
{
    int len1=strlen(haystack),len2=strlen(needle);
    for(int i=0;i<=len1-len2;i++)
    {
        if(haystack[i]==needle[0])
        {
            if(len2==1)
            return i;
            int j=1;
            for(;j<len2;j++)
            {
                if(haystack[j+i]!=needle[j])
                {
                    break;
                } 
            } 
            if(j==len2)
                return i;
        }
    }
    return -1;
}

但结果不好:

之后,我看了KMP算法,确实巧妙。

我写的C语言代码是在每次 haystack 数组与needle数组比较元素不匹配后,在haystack上移动一位来进行重新比较,进而寻找正确位置。

而KMP算法则是每次移动若干位(根据字符串),进而缩短了时间。

KMP算法代码:

cs 复制代码
int strStr(char* haystack, char* needle) {
    int n = strlen(haystack), m = strlen(needle);
    if (m == 0) {
        return 0;
    }
    int pi[m];
    pi[0] = 0;
    for (int i = 1, j = 0; i < m; i++) {
        while (j > 0 && needle[i] != needle[j]) {
            j = pi[j - 1];
        }
        if (needle[i] == needle[j]) {
            j++;
        }
        pi[i] = j;
    }
    for (int i = 0, j = 0; i < n; i++) {
        while (j > 0 && haystack[i] != needle[j]) {
            j = pi[j - 1];
        }
        if (haystack[i] == needle[j]) {
            j++;
        }
        if (j == m) {
            return i - m + 1;
        }
    }
    return -1;
}

/*
作者:力扣官方题解
链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/solutions/732236/shi-xian-strstr-by-leetcode-solution-ds6y/
来源:力扣(LeetCode)
*/
相关推荐
苏荷水2 小时前
day12 leetcode-hot100-19(矩阵2)
算法·leetcode·矩阵
之之为知知2 小时前
数学笔记三:特殊矩阵
笔记·学习·线性代数·算法·职场和发展·矩阵·职场发展
苏荷水2 小时前
day12 leetcode-hot100-20(矩阵3)
算法·leetcode·矩阵
全栈凯哥2 小时前
Java详解LeetCode 热题 100(21):LeetCode 240. 搜索二维矩阵 II(Search a 2D Matrix II)详解
java·算法·leetcode
武子康2 小时前
大数据-273 Spark MLib - 基础介绍 机器学习算法 决策树 分类原则 分类原理 基尼系数 熵
大数据·人工智能·算法·决策树·机器学习·spark-ml
肥猪猪爸3 小时前
使用LSTM进行时间序列分析
数据结构·人工智能·rnn·深度学习·算法·lstm·时间序列分析
哈听星4 小时前
数值积分实验
算法
yours_Gabriel5 小时前
【力扣】面试题 01.04. 回文排列
java·数据结构·leetcode
Musennn5 小时前
leetcode106.从中序与后序遍历序列构造二叉树:索引定位与递归分治的完美配合
java·数据结构·算法·leetcode
OKkankan6 小时前
类和对象(中1)
c语言·数据结构·c++·算法