Perl KMP 算法

C++字符串替换:从基础实现到性能优化的完整指南 字符串处理是编程中的基础操作,其核心在于对字符序列的查找、匹配与修改。在C++中,std::string类提供了基础的find和replace方法,通过遍历与内存操作实现替换功能,这是理解字符串处理原理的起点。掌握高效的字符串替换技术对于构建健壮、高性能的应用程序至关重要,尤其在处理配置文件、日志解析、数据清洗和模板渲染等场景中。本文聚焦于C++字符串替换的工程实践,深入探讨了如何应对不同需求场景下的性能瓶颈与编码陷阱,例如通过预分配内存优化大规模文本处理效率,以及处理正则表达式替换时的跨平台兼容性问题。文 阅读详情

了解了一下KMP 算法,自己尝试实现,也比较简单,具体原理参考google baidu,不再重复,这里只作为一个学习的纪录。

use Data::Dumper;

my $from = 'abababd ababc';
my $find = 'ababc';

# 分隔字符串为array
my @from = split '', $from;
my @find = split '', $find;

print $find, "\n";
print @{ calc( \@find ) }, "\n";
print "\n";
print kmp( \@from, \@find );

############################
# 计算字符串的重复值
sub calc {
    my ($array) = @_;

    # 取与字串相同长度的array 并将第一个置0
    my @tmp = (@$array);
    $tmp[0] = 0;

# 之后的每一个字符都与开头字串比较,取@tmp 前一个值作为比较字符
# 若为0,前一字符个与开头不重复,比较字符指向开头0
# 若不为0,前一个字符与开头有重复,如果还相同,@tmp 值加1,否则为0,后继自符重新从头开始比较
    for ( 1 .. $#tmp ) {
        if ( $array->[$_] eq $array->[ $tmp[ $_ - 1 ] ] ) {
            $tmp[$_] = $tmp[ $_ - 1 ] + 1;
        }
        else {
            $tmp[$_] = 0;
        }
    }
    return \@tmp;
}

sub kmp {
    my ( $from, $find ) = @_;

    # 初始从开头比较
    my $i   = 0;
    my $tmp = calc($find);

    # 剩余字串长度小于搜索字串,则退出返回-1
    while ( ( $#{$from} - $i ) >= $#{$find} ) {

        # 观察每次步进长度
        print @$from[ $i .. $#{$from} ], "\n";

        # j 标记搜索到的字串长度
        my $j = 0;
        while ( $find->[$j] eq $from->[ $i + $j ] ) {

            # 搜索到的长度与字符串长度相同,说明找到,返回index位置
            if ( $j == $#{$find} ) {
                return $i;
            }
            else {
                $j++;
            }
        }

        # 有相同的字符串,根据计算的值来跳转多个字符并重新比较
        # $j 为相同的个数(以1为基数),@tmp[$j-1] 为同开始字符重复的个数
        if ($j) {
            $i += $j - $tmp->[ $j - 1 ];
        }
        else {
            $i++;
        }
    }
    return -1;
}

输出:
#字符串以及计算重复值结果
ababc
00120

#每次查找过程
abababd ababc
ababd ababc
abd ababc
d ababc
 ababc
ababc
8

优化:

由于KMP 搜索过程中已经判断了子字符串的重复性,下一次判断过程中可以根据计算的重复值跳过部分开头字符,直接从不重复的地方开始比较。如下为改进的算法:

sub kmp {
    my ( $from, $find ) = @_;

    # 初始从开头比较
    my $i   = 0;
    my $tmp = calc($find);

    my $j = 0;

    # 剩余字串长度小于搜索字串,则退出返回-1
    while ( ( $#{$from} - $i ) >= $#{$find} ) {

        # 观察每次步进长度
        print "$i $j => ", @$from[ $i .. $#{$from} ], "\n";

        # j 标记搜索到的字串长度
        while ( $j <= $#{$find} && $find->[$j] eq $from->[ $i + $j ] ) {
            $j++;
            print ".\n"; # 记录由于$j 的变化自符比较的减少过程,用于debug
        }

        # 有相同的字符串,根据计算的值来跳转多个字符并重新比较
        # $j 为相同的个数(以1为基数),@tmp[$j-1] 为同开始字符重复的个数
        if ( !$j ) {
            $i += 1;
        }
        elsif ( $j <= $#{$find} ) {
            $i += $j - $tmp->[ $j - 1 ];
            $j = $tmp->[ $j - 1 ];
        }
        else {
            return $i;
        }
    }
    return -1;
}


【IDM扩展】浏览器插件汇集全网文件下载格式 废话不多说,直接复制粘贴,即可! 阅读详情

相关推荐

C++字符串实战:内存、编码、性能与安全四大核心问题解决方案

字符串处理是编程中的基础概念,其本质是字符序列在内存中的表示与操作。在C++中,std::string等工具通过RAII机制管理内存,但其底层原理涉及动态内存分配、编码转换和迭代器操作。理解这些原理对于构建高性能、稳定的软件至关重要,其技术价值在于避免内存泄漏、性能瓶颈和安全漏洞。在实际应用场景中,如高并发服务器、多语言支持的系统或长期运行的服务,字符串处理不当会引发一系列问题。本文聚焦于C++项目中的字符串实战,针对内存管理、编码处理、性能优化和安全性四大核心挑战,提供了系统的解决方案和最佳实践,例如使用

weixin_34034670的博客 524

kmp代码实现

/* kmp彻底理解 next 数组 :用来指导S【i】串 T【j】串 对应字符失配 指导 i 不回溯,即j应该走多少个位置 next[j]:j位置前一个元素 需要 计算某个字符对应的next值,就是看这个j对应字符之前的字符串中有多大长度的相同前缀后缀 */ #include <stdio.h> #include <stdlib.h> #i...

Hufan的专栏 256

CentOS 6下yum安装nginx实战指南:离线兼容与启动加固

nginx 是一款高性能 HTTP 服务器与反向代理软件,其轻量、低资源占用和稳定特性,使其在老旧系统运维中仍具不可替代价值。在 CentOS 6 这类已终止支持(EOL)的发行版上,由于官方源下线、GPG 密钥过期、依赖版本错配及 SysV init 兼容性缺失,标准 yum 安装路径完全失效。本文聚焦真实生产约束——如电力调度、交通控制、社保终端等离线/工控环境,解析如何重建可信仓库源、闭环补全 openssl/pcre 等关键依赖、重写 /etc/init.d/nginx 启动脚本以适配 init 系

weixin_33739627的博客 341

Needleman-Wunsch(可视化多个最优结果)(perl)

上次发了个Needleman-Wunsch算法,只打印了一个结果,这次随便写了个很长很长的if,else(自己都看不下去),也没时间优化了,代码如下: #!/usr/bin/perl -w use strict; use autodie; #对于程序的说明:这个程序采用的是生信的Needleman-Wunsch 算法,起源较早,算是最早的序列比对算法了 #Needleman-Wunsch 算法简介:首先创建一个二维的得分矩阵,行和列相等,都比序列长度大一,还要有一个数据结构储存打分表,即2种相同

qq_45091883的博客 684

Metasploitable靶机渗透测试实战:从信息收集到权限提升的完整思维解析

渗透测试是网络安全领域的核心实践,旨在通过模拟攻击来评估系统安全性。其基本原理是遵循标准化的攻击生命周期,从信息收集开始,逐步进行漏洞分析、利用和权限提升。这一过程的技术价值在于,它不仅能发现系统弱点,更能帮助安全人员理解攻击者的思维路径,从而构建更有效的防御体系。在众多应用场景中,使用Metasploitable这类预设漏洞的靶机进行练习,是掌握渗透测试方法论的关键途径。通过系统性地实践信息收集、漏洞利用和权限提升等环节,学习者可以深入理解如Dirty COW内核漏洞和SUID配置错误等经典安全问题的成因

weixin_30730053的博客 337

Perl 腾讯股票信息收集

之前的新浪股票脚本信息不太全,参考前面一篇文章腾讯股票接口,写了一个更加方便的,信息比较全的。看代码: use utf8; use Encode; use strict; use warnings; use LWP::UserAgent; use threads (exit => 'threads_only',); use threads::shared; use constant UR

USTBHacker的专栏 1万+

Perl语言的算法

Perl是一种高级编程语言,设计初衷是用于文本处理,但随着发展,它的应用范围已扩展到网络编程、系统管理、数据库交互等多个领域。Perl的魅力之一在于其“有很多方法可以做到同一件事”的理念,这使得程序员能够灵活选择最适合其需求的方式来实现算法。

2501_90373090的博客 995

Perl 新浪股票信息收集

通过解析SINA HTTP 返回的数据获取股票信息,具体返回值参考文章实时股票数据接口大全。 使用说明: perl script.pl [-c -f] -d 获取默认@defaultstock列表中股票信息,参数-c 清屏,参数-f 输出更加完整的信息,参考图例 perl script.pl -m [sh sz zx cy] 四个参数分别代表获取上海,深圳,中小,创业板股票的信息

USTBHacker的专栏 7612

KMP 算法扩展工作收工kaka

目标: 读取一段任意长度的字符串,从其中找出指定长度的所有子串的出现位置要求: 时间和空间复杂度优化算法: 主要是在比较时用到KMP算法,当然还有很多意料之外的问题....实现语言: C++( hybrid C 汗ing)感言: 自己太懒,写了n久.......感悟: 是否用文本处理语言譬如perl 或者ruby 来处理更有优势,希望能有人写一个这种版本的代码程序如下:/Files/pai...

weixin_33694620的博客 88

永磁同步电机ADRC控制策略优化:从理论到Simulink仿真实践

本文深入探讨了永磁同步电机自抗扰控制(ADRC)策略的优化与实践。针对传统PID在动态响应、抗扰及噪声抑制方面的不足,详细解析了ADRC三大核心组件——跟踪微分器(TD)、扩张状态观测器(ESO)与非线性状态误差反馈(NLSEF)的工作原理。通过手把手的Simulink仿真教程,展示了从算法编写、模型搭建到参数整定的完整流程,并进阶实现了位置-速度双环ADRC协同控制,为高性能电机伺服系统设计提供了从理论到实践的清晰指南。

root9的博客 412

Research Proposal:自动驾驶 行人运动预测

Research Proposal about Pedestrian/Cyclist Motion Prediction for Self-Driving Vehicles   If I can be provided with the opportunity to conduct PhD research in pedestrian/cyclist motion prediction for...

Poetry Wanderer的博客 3087

测试php性能和mysql数据库性能的工具_和找出瓶颈的方法_php程序员面试题

请列举你能想到的UNIX信号,并说明信号用途。请列举、你能想到的所有的字符串查找算法,并加注释简单说明。有一个IP地址(192.168.0.1),请写出其32位无符号整数形式。写出、你能想到的所有HTTP返回状态值,并说明用途(比如:返回404表示找不到页面)向php传入参数的两种方法。(mysql)请写出数据类型(int char varchar datetime text)的意思; 请问var...

weixin_29731589的博客 97

1.Fay-UE5数字人工程导入(UE数字人系统教程)

ue5数字人系列教程(含源文件工程)

1万+

POJ2752 Seek the Name, Seek the Fame(前后缀最大匹配,kmp)

Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names to their newly-born babies. They seek the name, and at th

riba2534的博客 624

【新版系统架构】系统架构设计师教程全篇知识点提炼

信息系统的5个基本功能:输入、存储、处理、输出和控制信息系统的发展:诺兰模型:初始阶段、传播阶段、控制阶段、集成阶段、数据管理阶段、成熟阶段信息系统的分类:传统的信息系统分为:业务(数据)处理系统、管理信息系统(MIS)、决策支持系统(DSS)、专家系统(ES)、办公自动化系统(OAS)等5类信息系统的生命周期:1、产生阶段2、开发阶段(总体规划、系统分析、系统设计、系统实施、系统验收阶段)3、运行阶段4、消亡阶段信息系统建设原则:1、高层管理人员介入原则。

分享技术干货和灵感、推荐新书和好玩的项目、分享Java面试题 1万+

MacBook M芯片第二篇:Homebrew安装

Homebrew是MacOS/Linux平台的软件包管理工具,提供便捷的安装、卸载、更新等功能。

码农魏轩 893

10种编程语言实现!gh_mirrors/algorithms6/Algorithms中的经典算法对比终极指南 [特殊字符]

**算法和数据结构是计算机科学的核心**,而学习不同编程语言实现相同算法是提升编程能力的绝佳方式。gh_mirrors/algorithms6/Algorithms项目正是一个包含多种编程语言实现的算法和数据结构宝库,让你可以一次性对比10+种语言的实现差异!这个开源项目汇集了从基础排序算法到复杂数据结构的完整实现,是学习算法和编程语言特性的完美资源。 ## 📊 项目概览:多语言算法实现的宝库

gitblog_00051的博客 403

PCL 贪婪投影三角剖分算法【2025最新版】

本博客在学习PCL中的贪婪投影三角算法的基础上,实现了使用彩色点云重建彩色模型的应用案例。博客长期更新,最近一次更新时间为:2025年7月6日。

点云侠的博客 37万+

How to only capute sub-matched character by grep

File content: <a href="ceph-0.80.9-82.1.x86_64.rpm"><img src="/icons/rpm.gif" alt="[ ]" width="16" height="16" /></a> <a href="ceph-0.80.9-82.1.x86_64.rpm">ceph-0.80.9-82.1....

weixin_30649641的博客 150

深入剖析 Hive 中 CASE WHEN 与 IF 函数的性能差异:解锁高效数据处理的关键

CASE WHEN 函数堪称 Hive 中条件判断的多面手,它具备两种强大的语法形式,以应对各种复杂的业务逻辑。简单 CASE 表达式这种形式适用于对某一列的值进行直接的条件匹配。其语法如下:END例如,我们有一个记录学生成绩的表CASE scoreELSE 'D'搜索 CASE 表达式当业务逻辑需要更灵活的条件判断时,搜索 CASE 表达式便派上用场。它的语法为:CASEENDCASEELSE 'D'

2401_83088008的博客 1125

大模型——AI对话四象限

{ "摘要": "文章揭示了90%的人不会有效与AI沟通的问题,指出简单粗暴的提问只能得到标准答案。作者提出'AI对话四象限'模型:1)双方都懂时提效;2)AI懂但需学会分层提问;3)共同探索未知领域;4)向AI传授独家知识。强调沟通技巧的重要性,认为会提问的人不会被AI替代。最后呼吁读者尝试四象限思维,与AI碰撞火花。" }

311

褶子了(统计每个数字出现的次数,利用下标映射数组值和负数-1,-2,...统计次数)

刚刚做了一道题,其实还蛮简单的,但是要在很短时间内做好,就要注意每道题的分配时间。还有就是要在做之前想清楚怎么做。 数组中的数字1~n,统计重复数字和重复的次数,用O(1)的空间复杂度,O(N)的时间复杂度。 计算能组成能组成的矩形最大面积。其实挺简单的,没时间了。。。 #Q2 n=12 L=[2,4,7,12,5,12,10,11,0,7,5,9] L=sorted(L)[::-1] ...

blue‘s blog 307

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

iOS编译openmp

iOS编译openmp。

心如止水-GISer的成长之路 1198

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

js正则表达式

本文基于此教程 正则表达式是啥来的 正则表达式是由一个字符序列形成的搜索模式,一种规则。 通俗来说,就是一个模板,接下来如果使用相关的函数都会以这个为模板,在主字符串中找到和模板一样形式的子字符串, 举个例子 var patt = /runoob/ 我们搞了一个模板 runoob,也就是我们希望被查找的字符串中含有runoob这个字符串 语法(perl语言风格) /正则表达式主体/修饰符(修饰符可写可不写) 如var patt = /runoob/i 意思是我希望主字符串中有子字符串runoob,并且执

WAWA战士的博客 162

FFI 外部函数接口详解

FFI 外部函数接口摘要 FFI(外部函数接口)是不同编程语言间的"外交层",负责函数调用、类型转换和内存管理。其核心路径是高级语言→C ABI→原生内核,因为C ABI是操作系统层面的通用标准。主流方案包括Python的ctypes、Go的cgo、Java的JNI等。 关键要点: C/C++是跨语言SDK的首选内核,因各语言均有成熟C绑定 生产环境需注意内存管理、线程模型和异常处理 替代方案包括RPC(隔离性好)和Wasm(浏览器场景) C++对外需使用extern "C"或纯虚接口保证ABI稳定 典型问

REDcker的博客 557

腾迅股票数据接口 http/javascript

之前使用了新浪的股票数据,由于新浪http/javascript缺少一些数据,用chrome自带的开发工具监视腾迅财经HTTP信息,得到以下获取股票数据的方法。 以五粮液为例,要获取最新行情,访问数据接口: http://qt.gtimg.cn/q=sz000858 返回数据: v_sz000858="51~五 粮 液~000858~27.78~27.60~27.70~41

USTBHacker的专栏 11万+
上一篇: Perl 闭包模拟类实现二叉树
下一篇: Perl 判断一个字符串中所有字符是否在另外一个字符串中出现
Bai_Yuanyong
博客等级 码龄24年 46粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值