首页 > 其他分享 >28.找出字符串中第一个匹配项的下标 (Medium)

28.找出字符串中第一个匹配项的下标 (Medium)

时间:2023-06-13 15:47:38浏览次数:45  
标签:Medium 下标 ++ needle 28 next haystack now

问题描述

28. 找出字符串中第一个匹配项的下标 (Medium)

给你两个字符串 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 <= 10⁴
  • haystackneedle 仅由小写英文字符组成

解题思路

标准的kmp算法模板题。

代码

class Solution {
public:
    void SetNext(vector<int> &next, string needle) {
        int x = 1, now = 0;
        while (x < needle.size()) {
            if (needle[x] == needle[now]) {
                next[x++] = ++now;
            } else if (now != 0) {
                now = next[now - 1];
            } else {
                next[x] = 0;
                x += 1;
            }
        }
    }
    int strStr(string haystack, string needle) {
        int m = needle.size(), n = haystack.size();
        vector<int> next(m);
        SetNext(next, needle);
        int i = 0, j = 0;
        while (i < n && j < m) {
            if (haystack[i] == needle[j]) {
                ++i;
                ++j;
            } else {
                if (j > 0) {
                    j = next[j - 1];
                } else {
                    ++i;
                }
            }
        }
        if (j >= m) {
            return i - m;
        }
        return -1;
    }
};

标签:Medium,下标,++,needle,28,next,haystack,now
From: https://www.cnblogs.com/zwyyy456/p/17477719.html

相关文章

  • 373. 查找和最小的 K 对数字 (Medium)
    问题描述373.查找和最小的K对数字(Medium)给定两个以升序排列的整数数组nums1和nums2,以及一个整数k。定义一对值(u,v),其中第一个元素来自nums1,第二个元素来自nums2。请找到和最小的k个数对(u₁,v₁),(u₂,v₂)...(uₖ,vₖ)。示例1:输入:nums1......
  • UNIQUE VISION Programming Contest 2023 New Year (AtCoder Beginner Contest 287) A
    UNIQUEVISIONProgrammingContest2023NewYear(AtCoderBeginnerContest287)A-MajorityProblemStatement题意:给你n个字符串,字符串是For表示agree,字符串Against表示disagree,让你判断最终是否通过。Solution思路:统计For和Against的数量,比较一下即可。#include......
  • AtCoder Beginner Contest 284 ABCDE
    AtCoderBeginnerContest284A-SequenceofStringsProblemStatement题意:给你n个字符串,让你倒序输出Solve#include<bits/stdc++.h>usingnamespacestd;constintN=20;strings[N];intmain(){ intn; cin>>n; for(inti=1;i<=n;i++) cin>>s......
  • 51nod-1280 前缀后缀集合
    原题链接1280 前缀后缀集合题目来源: Codility基准时间限制:1 秒空间限制:131072 KB分值: 40 难度:4级算法题 收藏 关注一个数组包含N个正整数,其中有些是重复的。一个前缀后缀集是满足这样条件的下标对(P,S),0<=P,S......
  • Codeforces Round #287 (Div. 2)-D. The Maths Lecture(数位dp)
    原题链接D.TheMathsLecturetimelimitpertestmemorylimitpertestinputoutputAmrdoesn'tlikeMathsashefindsitreallyboring,soheusuallysleepsinMathsl......
  • Codeforces Round #287 (Div. 2)-Guess Your Way Out!
    原题链接C.GuessYourWayOut!timelimitpertestmemorylimitpertestinputoutputh.Theplayerisinitiallystandingattherootofthetreeandtheexitfromthetreeislocatedatsomeleafnode.2h.Thee......
  • poj-2823 Sliding Window(单调队列)
    原题链接SlidingWindowTimeLimit: 12000MS MemoryLimit: 65536KTotalSubmissions: 54929 Accepted: 15814CaseTimeLimit: 5000MSDescriptionAnarrayofsize n ≤106 isgiventoyou.Thereisaslidingwindowofsize k whichismoving......
  • Codeforces Round #283 (Div. 2)-C. Removing Columns
    原题链接C.RemovingColumnstimelimitpertestmemorylimitpertestinputoutputn × mabcdedfghijk weobtainthetable:acdefghjk goodInputn and m (1 ≤ n, m ≤ 100).n line......
  • HDU 2883 kebab(离散化+最大流)
    题意:给定n个顾客,第i号顾客在si到达,点了ni个羊肉串,每个羊肉串需要ti个时间烤好。顾客想要在ei得到,一个烤炉只烤m串。问你是否能满足所有顾客的要求?能的话输出“Yes”,否则输出“No”。思路:转自网上     其实本题的本质就是HDU3572的思想,每个顾客其实提出的是需要ni*ti个单......
  • HDU 2838 Cow Sorting(树状数组)
    题意:首先每次只能交换相邻的两头牛,并且最后要求升序排列,所以最后整个序列的逆序是0,每次交换只可以消除1个逆序。(令a[i]的逆序是从1到i-1比它大的数的个数。)思路:对于某个数,要把它变成有序的,那么很容易可以推算出公式就是它自身的逆序数乘自身的值再加上它的逆序数的和,自己算算看看。......