首页 > 编程语言 >字符串算法

字符串算法

时间:2024-03-31 17:11:33浏览次数:20  
标签:min while 算法 && 字符串 回文 d1

Manacher-------快速查找回文串

这个算法其实是基于暴力查找回文串的优化。

	while(i-k>=0&&i+k<n&&s[i-k]==s[i+k]){
            k++;
        }

这就是暴力查找以s[i]为中心点的奇数长的回文串,偶数也一样就是改一下下角标就可以。

这个算法的优化其实就是以s[i]为中点的回文串,左右两边会有相同的回文串特点,也就是d1[i-k]=d1[i+k],但是要注意一个情况,i-k的回文串长度可能会超出当前这个i的回文串,那左边满足的右边就不一定满足。

k=min(d1[l+r-i],r-i+1);
这句就是在规避这一情况。

一旦当前位置已经跑出上一个回文串的范围就只能用暴力跑新的回文串,没有可以继承的和它对称的左半部分的回文串中心了。

for(int i=0,l=0,r=-1;i<n;i++){//跑的是奇数长度的回文串
        int k;
        if(i>r){
            k=1;//上次的回文串已经结束了,只能暴力跑
        }
        else{
            k=min(d1[l+r-i],r-i+1);//有可能左边那个点的回文串长度超出上次的回文串的边界
        }
        while(i-k>=0&&i+k<n&&s[i-k]==s[i+k]){
            k++;
        }
        //k--;
        d1[i]=k--;

        if(i+k>r){//更新回文串范围
            l=i-k;
            r=i+k;
        }
    }
for(int i=0,l=0,r=-1;i<n;i++){//偶数长度的回文串
        int k;
        if(i>r){
            k=0;
        }
        else{
            k=min(d2[l+r-i+1],r-i+1);
        }
        while(i-k-1>=0&&i+k<n&&s[i-k-1]==s[i+k]){
            k++;
        }
        //k--;
        d2[i]=k--;

        if(i+k>r){
            l=i-k-1;
            r=i+k;
        }
    }

偶数和奇数的差别就是边界的判断,偶数相当于就是把后面那个字符当做字符串中心。

标签:min,while,算法,&&,字符串,回文,d1
From: https://www.cnblogs.com/zyzzzz/p/18106950

相关文章

  • 模拟退火(simulated annealing,SA)算法解决TSP问题
        模拟退火(simulatedannealing,SA)算法    该算法的思想最早是由Metropolis等提出的。其出发点是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法,其物理退火过程由以下三部分组成:    (1)加温......
  • 目前国内全地形能力最强的双足机器人 —— 逐际动力 —— 提出迭代式预训练(Iterative
    相关:https://weibo.com/1255595687/O5k4Aj8l2该公司对其产品的强化学习训练算法给出了较少的描述:提出迭代式预训练(IterativePre-training)方法,把通用机器人的基础运动能力划分为不同级别,进行循序渐进的预训练,这个过程让训练的结果更可控,从而高效地产出和收集有效数据,训练......
  • 代码随想录算法训练营第32天| 122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏
    122.买卖股票的最佳时机II题目链接:买卖股票的最佳时机II题目描述:给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出......
  • 代码随想录算法训练营第34天| 1005. K 次取反后最大化的数组和、134. 加油站、135. 分
    1005.K次取反后最大化的数组和题目链接:K次取反后最大化的数组和题目描述:给你一个整数数组nums和一个整数k,按以下方法修改该数组:选择某个下标i并将nums[i]替换为nums[i]。重复这个过程恰好k次。可以多次选择同一个下标i。以这种方式修改数组后,返回数......
  • 代码随想录算法训练营第36天| 435. 无重叠区间、763.划分字母区间、56. 合并区间
    435.无重叠区间题目链接:无重叠区间题目描述:给定一个区间的集合intervals,其中intervals[i]=[starti,endi]。返回需要移除区间的最小数量,使剩余区间互不重叠。解题思想:这道题目和射气球很像。*“需要移除区间的最小数量,使剩余区间互不重叠”*等效于求重叠区......
  • PTA R7-5 找最大的字符串
    R7-5找最大的字符串分数10入门全屏浏览切换布局作者 王秀单位 福州大学输入5个字符串,输出其中最大的字符串。输出格式:printf("Maxis:%s\n",);输入输出示例:括号内为说明,无需输入输出输入样例:peachpearmelonorangeberry输出样例:Maxis:pear #i......
  • 代码随想录算法训练营第10天 | 栈和队列
    理论基础栈和队列是STL(C++标准库)里面的两个数据结构STL中栈往往不被归类为容器,而被归类为containeradapter(容器适配器)栈的内部结构,栈的底层实现可以是vector,deque,list都是可以的,主要就是数组和链表的底层实现我们常用的SGISTL,如果没有指定底层实现的话,默认是以deque为......
  • 「PHP系列」PHP 常量/字符串、类型比较
    文章目录一、PHP常量1.定义常量使用`define()`函数使用`const`关键字(在类内部)2.访问常量3.常量的特点4.注意事项5.示例二、PHP字符串1.定义字符串使用单引号使用双引号使用heredoc和nowdoc2.字符串操作字符串连接字符串长度字符串替换字符串查找字符串......
  • 【数据结构与算法篇】动态顺序表及相关OJ算法题
    【数据结构与算法篇】动态顺序表及相关OJ算法题......
  • 【Java编程】【算法面试题】【数组轮转】给定一个整数数组 nums,将数组中的元素向右轮
    原题:给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。例如:nums=[1,0,-1,2,3]k=1预期结果:nums=[3,1,0,-1,2]k=2预期结果:nums=[2,3,1,0,-1]以此类推。。。【本文思路解析】:1.不实用额外的数组,会多一部分开销;2.每次轮转,位置移动1位,共计移......