首页 > 其他分享 >Sunday字符串匹配

Sunday字符串匹配

时间:2023-07-13 19:45:42浏览次数:30  
标签:字符 匹配 int 模式 Sunday 字符串 串中 patten

引入

Sunday 算法是一种极其容易理解的算法,复杂度较为玄学。

事实上,这个算法没啥用

实现

Sunday算法的实现只比暴力匹配多了一个步骤,它在匹配失败时关注的是主串中参与匹配的最末尾字符的下一位字符,分为两种情况:

该字符没有在模式串中出现过,移动位数=模式串长度+1

该字符在模式串中出现过,移动位数=模式串中该字符最右出现的位置(以0开始)到尾部的距离+1 。

举个栗子,假定现在要在主串 substringsearchingxiaowu 中查找模式串 search

刚开始时,将两个字符串的左边对齐

结果是在第二个字符串处发现不匹配,此时关注文本串中参与匹配最末位字符的下一位字符,即绿色的字符 i ,因为模式串中并不存在 i ,所以将模式串直接跳过一大片,享有移动位数=6(模式串长度)+1=7,从 i 之后的那个字符 n 开始下一步匹配

结果第一个字符就不匹配,再看文本串中参与匹配最末位的下一位字符 r ,它出现在模式串倒数第三位,于是把模式串向有移动三位( r 到模式串末尾的距离+1为3)使两个 r 对齐

匹配成功

基本代码实现(在母串 str 中寻找子串 patten ):

#include <iostream>
using namespace std;
const int inf = 0x3f3f3f3f;

string str, patten;

int p[256];

signed main() {
    cin >> str >> patten;
    int len1 = str.length(), len2 = patten.length();

    for (int i = 0; i < 256; ++i)
        p[i] = len2 + 1; //先全部初始化,如果字符不存在,直接移动len2+1的长度

    for (int i = 0; i < len2; ++i)
        p[patten[i]] = len2 - i;

    int ans = 0, i = 0;

    while (i <= len1 - len2) {
        int j = 0, temp = i;

        while (patten[j++] == str[temp++] && j < len2); //尝试匹配

        ans += (j == len2); //如果j==len2,是说明有找到,ans++
        i += p[str[i + len2]]; //移动
    }

    cout << ans; //输出答案
    return 0;
}

标签:字符,匹配,int,模式,Sunday,字符串,串中,patten
From: https://www.cnblogs.com/wshcl/p/17551937.html

相关文章

  • 2.2、字符串截取函数
    substring() mysql>selectsubstring('abc',1,1);+----------------------+|substring('abc',1,1)|+----------------------+|a|+----------------------+1rowinset(0.00sec)   mid() mysql>selectmid((selectdatabas......
  • ChatGPT 问答00003 mysql中删除原来的自增ID,并重新根据字符串字段data字段排序重新生
    在MySQL中,自增ID是由MySQL引擎自动生成和维护的,通常与数据表的主键关联。删除自增ID并重新生成的需求比较特殊,因为自增ID的生成是基于数据表中已有的记录顺序的,直接删除和重新生成可能会破坏数据完整性和索引等方面的约束。不建议直接删除和重新生成自增ID,但你可以通过以下步骤实......
  • 【Redis】字符串sds
    sds,即SimpleDynamicStrings,是Redis中存储绝大部分字符串所采用的数据结构。typedefchar*sds;一、类型sds的类型包括SDS_TYPE_5,SDS_TYPE_8,SDS_TYPE_16,SDS_TYPE_32,SDS_TYPE_64五种:#defineSDS_TYPE_50#defineSDS_TYPE_81#defineSDS_TYPE_162#defineSD......
  • 解决python正则匹配以某汉字开头,以}结尾的具体操作步骤
    Python正则匹配以某汉字开头,以}结尾前言在文本处理过程中,我们经常需要使用正则表达式来进行模式匹配,以找到特定的文本。Python中的re模块提供了正则表达式的支持,可以应用于各种文本处理任务中。本文将介绍如何使用Python的正则表达式来匹配以某汉字开头,以}结尾的文本。正则表达......
  • python 数据类型 字符串
    目录python数据类型字符串Python字符串定义Python字符串连接Python转义字符Python字符串运算符Python字符串格式化Unicode字符串python的字符串内置函数python数据类型字符串Python字符串定义#字符串是Python中最常用的数据类型。我们可以使用引号('或")来创建字......
  • 解决正则匹配 在线 JAVA的具体操作步骤
    正则匹配在线JAVA简介正则表达式是一种用于匹配和操作字符串的强大工具。在JAVA中,我们可以使用正则表达式来进行字符串的模式匹配、查找和替换等操作。本文将介绍如何使用JAVA的正则表达式库来进行在线JAVA代码的匹配。正则表达式的基本语法正则表达式由普通字符和特殊字符组成......
  • c# 读取json字符串节点内容
    c#读取json字符串节点内容stringjsonstr="{\"voiceprompt_callback\":{\"result\":\"1\",\"accept_time\":\"0\"}}";varty=JsonConvert.DeserializeObject(jsonstr);Newtonsoft.Json.Linq.JOb......
  • 直接“printf”到char数组字符串——C语言snprintf函数
    注:我写这个只是为了备注并介绍一下这个神器。有关它的更详细用法,互联网的各个角落都不缺少资料。如果您和曾经的我一样是C语言的初学者,您有可能时常遇到那些“奇异”的字符串处理问题,例如,int里的数转成char数组字符串类型,在char数组中间插入或者删除什么东西,等等。要是采用传统方......
  • 字符串转list以及list调remove方法报错
    Stringstr=scanner.nextLine();String[]arr=str.split("");List<String>list=newArrayList<>(Arrays.asList(arr));注意:使用Array.aslList时转出来的list是没有add和remove方法的,所以我们调用就会报错,把它放到newArrayList里面就能解决这个......
  • Python-字符串.py
     1#!/usr/bin/python 2#coding=UTF-8 3 4str="helloworld!" 5 6printstr                      #输出整个字符串 7         8printstr[0]           #输出字符串的第一个字符 9         10......