首页 > 编程语言 >(算法)最⻓回⽂⼦串————<字符串—中⼼扩散>

(算法)最⻓回⽂⼦串————<字符串—中⼼扩散>

时间:2024-08-26 16:52:40浏览次数:6  
标签:begin right len 算法 num && 字符串 扩散 left

1. 题⽬链接:5.最⻓回⽂⼦串 

2. 题⽬描述:

3. 解法(中⼼扩散):

算法思路:

枚举每⼀个可能的⼦串⾮常费时,有没有⽐较简单⼀点的⽅法呢?

对于⼀个⼦串⽽⾔,如果它是回⽂串,并且⻓度⼤于2,那么将它⾸尾的两个字⺟去除之后,它仍然是 个回⽂串。如此这样去除,⼀直除到⻓度⼩于等于2时呢?⻓度为1的,⾃⾝与⾃⾝就构成回⽂;⽽ ⻓度为2的,就要判断这两个字符是否相等了。 

从这个性质可以反推出来,从回⽂串的中⼼开始,往左读和往右读也是⼀样的。那么,是否可以枚举 回⽂串的中⼼呢?

从中⼼向两边扩展,如果两边的字⺟相同,我们就可以继续扩展;如果不同,我们就停⽌扩展。这样 只需要⼀层for循环,我们就可以完成先前两层for循环的⼯作量。 

C++算法代码: 

class Solution 
{
public:
    string longestPalindrome(string s) 
    {
        string answer;  //答案
        int max_num=0; //最长大小
        int begin=0;    //起始位置
        //遍历每一位置
        for(int i=0;i<s.size();i++)
        {
            //寻找奇数长度
            int left=i,right=i;
            //退出循环时左右都各超出了一位
            while(left >= 0 && right < s.size() && s[left] == s[right])
            {
                left--;
                right++;
            }
            if(right - left - 1 > max_num)
            {
                begin = left+1 ;
                max_num = right - left - 1;
            }
            //寻找偶数长度
            left=i,right=i+1;
            //退出循环时左右都各超出了一位
            while(left >= 0 && right < s.size() && s[left] == s[right])
            {
                left--;
                right++;
                
            }
            if(right - left - 1 > max_num)
            {
                begin = left+1 ;
                max_num = right - left - 1;
            }
        }
        return s.substr(begin,max_num);
    }
};

Java算法代码:

class Solution
{
	public String longestPalindrome(String s)
	{
		int begin = 0, len = 0, n = s.length();
		for (int i = 0; i < n; i++) // 固定所有的中间点 
		{
			// 先扩展奇数⻓度的⼦串 
			int left = i, right = i;
			while (left >= 0 && right < n && s.charAt(left) == s.charAt(right))
			{
				left--;
				right++;
			}
			if (right - left - 1 > len)
			{
				begin = left + 1;
				len = right - left - 1;
			}
			// 扩展偶数⻓度 
			left = i; right = i + 1;
			while (left >= 0 && right < n && s.charAt(left) == s.charAt(right))
			{
				left--;
				right++;
			}
			if (right - left - 1 > len)
			{
				begin = left + 1;
				len = right - left - 1;
			}
		}
		return s.substring(begin, begin + len);
	}
}

标签:begin,right,len,算法,num,&&,字符串,扩散,left
From: https://blog.csdn.net/2301_79580018/article/details/141567283

相关文章

  • 【AI大模型算法工程师就业指南】—— 高薪就业策略,转行大模型领域的诚挚建议!
    从ChatGPT到新近的GPT-4,GPT模型的发展表明,AI正在向着“类⼈化”⽅向迅速发展。GPT-4具备深度阅读和识图能⼒,能够出⾊地通过专业考试并完成复杂指令,向⼈类引以为傲的“创造⼒”发起挑战。现有的就业结构即将发⽣重⼤变化,社会⽣产⼒的快速提升将催⽣新的⾏业和岗位机会。如......
  • 算法:双指针
    题目:复写零虽然题目说必须要就地但是我们可以先试试异地然后再想办法优化成本地算法讲解:异地可以定义两个指针让它们分别指向本地和异地,当本地指针指向零时这时候就往异地写入两个零其余就照常写,说完异地做法那我们应该如何优化成就地做法呢?就地本地也要定义两个指针往......
  • Python集成学习和随机森林算法使用详解
    概要集成学习是一种通过组合多个模型来提高预测性能的机器学习方法。它通过将多个弱学习器的结果结合起来,形成一个强学习器,从而提升模型的准确性和稳健性。随机森林(RandomForest)是集成学习中一种非常流行且有效的算法,特别适用于分类和回归任务。本文将详细介绍Python中如何......
  • 代码训练营 Day9 | 151.翻转字符串里的单词 | 认识KMP算法
    151.翻转字符串里的单词这道题的难度在于如何高效率的处理空格对于python来说不能实现空间O(1)的复杂度,不过对于其他语言来说下面思路可以使用双指针方法同时指向数组的头部循环遍历整个字符串直到数组末尾快指针不能为空,因为快指针是要获取字母的,慢指针是用来获取新的字......
  • 代码训练营 Day8 | 344.反转字符串 | 541.反转字符串II |
    344.反转字符串使用双指针一个指针指向数组开始的位置,一个指针指向数组结束的位置通过循环让两个指针元素相互交换知道两个指针碰到一起classSolution(object):defreverseString(self,s):""":types:List[str]:rtype:NoneDonotretur......
  • 免费分享一套Java协同过滤推荐算法的SpringBoot+Vue(图书)商城系统【论文+源码+SQL脚
    大家好,我是java1234_小锋老师,看到一个不错的Java协同过滤推荐算法的SpringBoot+Vue(图书)商城系统,分享下哈。项目视频演示【免费】Java协同过滤推荐算法的SpringBoot+Vue(图书)商城系统Java毕业设计_哔哩哔哩_bilibili项目介绍伴随着Internet的蓬勃发展,电子商务也取得了......
  • 排序算法
    冒泡排序冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。......
  • 国密算法简介
    加密算法公开密钥长度分组长度分类加密强度其他SM1否128128对称密码AESSM2是128128非对称密码大于RSA基于ECC,加密强度和运算速度均大于RSASM3是128128单向散列密码MD5校验结果256SM4是128128对称密码(分组密码)AESSM9是128128......
  • 第十五期 02 Diffusion扩散模型
    一:马尔可夫链(一)什么是马尔可夫链又称离散时间马尔可夫链,那就是某一时刻状态转移的概率只依赖于它的前一个状态。举个简单的例子,假如每天的天气是一个状态的话,那个今天是不是晴天只依赖于昨天的天气,而和前天的天气没有任何关系。马尔科夫链在很多时间序列模型中得到广泛的应用......
  • 堆排序算法及优化(java)
    目录1.1引言1.2堆排序的历史1.3堆排序的基本原理1.3.1堆的概念1.3.2堆排序的过程1.3.3堆调整1.3.4堆排序算法流程1.4堆排序的Java实现1.4.1简单实现1.4.2代码解释1.4.3优化实现1.4.4代码解释1.5堆排序的时间复杂度1.5.1分析1.5.2证明1.6堆排序......