首页 > 其他分享 >28.implement-str-str 实现strStr()

28.implement-str-str 实现strStr()

时间:2022-08-15 21:22:33浏览次数:54  
标签:strStr string int needle next ++ str implement size

KMP算法

关键在于如何求next数组

void getNext(int *next, const string &s) {
    int j = -1;
    next[0] = j;
    for (int i = 1; i < s.size(); i++) {
        // next[j + 1]指向匹配好的前缀的下一个字符
        // i指向后缀末尾位置
        while (j >= 0 && s[i] != s[j + 1]) {
            j = next[j];
        }
        if (s[i] == s[j + 1]) {
            j++;//j+1表示最长相等子串的长度,所以字符相等时,长度递增
        }
        next[i] = j;
    }
}

完整代码

#include <string>
using std::string;
class Solution {
  public:
    void getNext(int *next, const string &s) {
        int j = -1;
        next[0] = j;
        for (int i = 1; i < s.size(); i++) {
            // next[j + 1]指向匹配好的前缀的下一个字符
            // i指向后缀末尾位置
            while (j >= 0 && s[i] != s[j + 1]) {
                j = next[j];
            }
            if (s[i] == s[j + 1]) {
                j++;
            }
            next[i] = j;
        }
    }
    int strStr(string haystack, string needle) {
        if (needle.size() == 0)
            return 0;
        int next[needle.size()];
        getNext(next, needle);
        int j = -1;
        for (int i = 0; i < haystack.size(); i++) {
		//出现不等时,跳到最长相等子串的下一个字符处
            while (j >= 0 && haystack[i] != needle[j + 1]) {
                j = next[j];
            }
            if (haystack[i] == needle[j + 1]) {
                j++;
            }
            if (j == (needle.size() - 1))
                return i - needle.size() + 1;
        }
        return -1;
    }
};

标签:strStr,string,int,needle,next,++,str,implement,size
From: https://www.cnblogs.com/zwyyy456/p/16589662.html

相关文章

  • TypeScript function arguments destructuring All In One
    TypeScriptfunctionargumentsdestructuringAllInOneconstlog=console.log;constcontext={repo:{repo:"cdn",owner:"xgqfrms",},ser......
  • bootstrap
    该框架已经写好了很多页面样式,如果需要使用,只需要下载它对应文件,之后直接cv拷贝即可在使用Bootstrap的时候所有的页面样式都只需要你通过class来调节即可版本选择建议使......
  • c++标准IO 中的string流
    c++标准IO中的string流sstream头文件sstream头文件定义了三个类型来支持内存和string之间的IO,在用户看来,string类就像是一个IO流一样。istringstream处理行内的多......
  • Request.QueryString 的用法
    https://blog.csdn.net/dragon_ton/article/details/49464413?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogComme......
  • str常用操作方法
    s='taiBai's1=s.upper()print(s1)全部转化为大写  username=input('用户名')password=input('密码')code='QweA'print(code)your_code=input('请输入验......
  • 1007 公交线路 dijkstra板子+总结
     链接:https://ac.nowcoder.com/acm/contest/26077/1007来源:牛客网题目描述P市有n个公交站,之间连接着m条道路。P市计划新开设一条公交线路,该......
  • String的使用
    1.String的使用Strings1=“abc”;//字面量的定义方式Strings2=“abc”;System.out.println(s1==s2)//true,s1、s2指向同一个地址 1.String声明为final的,不可......
  • 自学java第天之obstract抽象类
    父类中,写了抽象方法:什么是抽象方法:publicobstractvoid方法(){},::::::::::::::::::;只有方法名字,没有方法实现那么如果有个类想要继承定义的这个抽象类,那么就要重写父......
  • 3、数组、集合、Lambda、Stream与Optional类
    一、数组:数组保存在JVM堆内存中1、数组的创建:(1)、一维数组创建方式一://一维数组方式一Integer[]array01={1,2,3};System.out.println("一维数组创建方式一");Sys......
  • CF EDU 96 E - String Reversal
    贪心、逆序对E-StringReversal题意给一个长度为n的字符串s,(n<=2e5),把s反转后的字符串记为s',每次只可以交换相邻两个字符,求把s变为s'的最小次数思路......