LeetCode Longest Palindromic Substring 最长回文子字符串 两种方法分析解答

2023-11-11

Longest Palindromic Substring

Given a stringS, find the longest palindromic substring inS. You may assume that the maximum length ofSis 1000, and there exists one unique longest palindromic substring.

对于这道题,要怎么设计这个table就是非常难想到的事情。因为要利用一个二维数组,把二维数组的两个下标作为标示主串里面的两个字符位置,实在是够难想到的了。

什么时候使用动态规划法:

• Optimal substructure
• Overlapping subproblems

构建解的方法:

Characterize structure of optimal solution
Recursively define value of optimal solution
Compute in a bottom-up manner

如果是用暴力法的话,就需要O(n^3) 时间效率了,但是使用动态规划法,就只需要O(n^2)的时间复杂度了。

最难想的地方:P代表一个表,比较难想的就是P表的下标i和j代表原字符串中的两个前后下标s[i]和s[j]的位置。
如果P[i,j]为真,当且仅当si-1,si-2...sj-1,sj这一个子串都为palindrome。例如:s[] = skrdjdre那么P[2][6] = true,因为s[2]=r=s[6],且djd为回文。

不明白,可以看下表,动手填一填,未填出的都初始化为false,其中t代表填写true:

2014-1-24 Update

Leetcode有更新了,增加了两个大数据测试,一般使用vector容器的动态规划法超时了,而且也禁止了使用二维数组,会报错memory limit exceeded。

所以更新下动态规划法,使用3个一维数组,测试通过,不过时间大概为836ms,还是最下面的两边扩展计算的解法最优了。

class Solution {
public:
	string longestPalindrome(string s) 
	{
		int index = 0, len = 1;
		int table[3][1000] = {1};
		int last = -1; int cur = 1;
		for (int i = 0; i < s.length(); i++)
		{
			table[0][i] = 1;
		}

		for (int i = 1; i < s.length(); i++)
		{
			if (s[i] == s[i-1])
			{
				table[cur][i] = 2;
				index = i-1;
				len = 2;
			}
			else table[cur][i] = 0;
		}

		for (int d = 2; d < s.length(); d++)
		{
			cur = (cur+1)%3; last = (last+1)%3;

			for (int i = 0, j = d; j < s.length(); i++, j++)
			{
				if (s[i] == s[j] && table[last][j-1] != 0) 
				{
					table[cur][j] = table[last][j-1]+2;

					if (table[cur][j] > len)
					{
						len = table[cur][j];
						index = i;
					}
				}
				else table[cur][j] = 0;
			}
		}
		return s.substr(index, len);
	}
};


下面就是实现上述思想的程序,时间复杂度O(n*n),空间复杂度O(n*n)

string longestPalindrome(string s) 
	{
		int n = s.length();
		vector<vector<bool> > table;
		vector<bool> temp(n, false);
		for (int i = 0; i < n; i++)
		{
			table.push_back(temp);
			table[i][i] = true;
		}
		//Attention: Don't forget we need two centor for palindrome
		int subStartPoint = 0;
		int maxLength = 1;
		for (int i = 1; i < n; i++)
		{
			if (s[i-1] == s[i])
			{
				table[i-1][i] = true;
				subStartPoint = i-1;
				maxLength = 2;
			}
		}//for
		for (int k = 3; k <= n; k++)
		{
			for (int i = 0; i <= n-k; i++)
			{
				int j=k+i-1;
				if (s[i] == s[j] && table[i+1][j-1] == true)
				{
					table[i][j] = true;
					if(maxLength < k)
					{
						subStartPoint = i;
						maxLength = k;
					}
				}
			}//for(int i = 0...
		}//for(k=3...
		return s.substr(subStartPoint, maxLength);
	}

实际leetcode运行速度:

但是其实有更加简单的方法,实际运行速度更加快。
思想:
1. 以每个s[i]字符为中心,两边测试看以这个字符为中心的回文长度是多少
2. 以每两个字符s[i-1]s[i]为中心,测试这两个字符是否相等,和以这两个字符为中心的回文有多长
最后记录最大长度和最大长度子串起点

其实我觉得这个算法比前面的算法还好理解:

int testTwoSides(string &s, int low, int up)
	{
		int n = s.length();
		int max = 0;
		if (low == up)
		{
			low--;
			up++;
			max = 1;
		}
		while (low>=0 && up<n && s[low] == s[up])
		{
			max+=2;
			low--;
			up++;
		}
		return max;
	}

	string longestPalindrome(string s) 
	{
		int n = s.length();
		int subStartPoint = 0;
		int maxLength = 1;
		int temp = 0;
		for (int i = 0; i < n; i++)
		{
			temp = testTwoSides(s, i, i);
			if (temp > maxLength)
			{
				subStartPoint = i - temp/2;
				maxLength = temp;
			}
		}
		for (int i = 1; i < n; i++)
		{
			temp = testTwoSides(s, i-1, i);
			if (temp > maxLength)
			{
				subStartPoint = i - temp/2;
				maxLength = temp;
			}
		}
		return s.substr(subStartPoint, maxLength);
	}


理论上这个算法的时间复杂度是O(n*n),空间复杂度O(1);

记得前段时间看到某博主对于类似的这样的算法说成时间复杂度是O(n),所以明确说明这个时间复杂度是:O(n*n)
计算起来有点麻烦,至于是如何计算的,因为牵涉单概率论的知识和算法时间复杂度计算基础知识,虽然不算很难的概率论知识,但是不是那么容易讲明白的。怕讲不好,而且也不用那么麻烦每个算法都那么正规的分析,不然就累死人额。

所以可以对于这个算法可以给出特定例子走一走,比如对于串aaaaaaaaaaa,那么它就是最坏情况的时间复杂了。
实际运行效果却是出奇的好:

2013/12/7 update:

上面的算法其实可以利用一个循环就可以了,不需要多一个循环,不过时间效率一样。应该可以稍微优化一点吧。

class Solution {
public:
	string longestPalindrome(string &s) 
	{
		int startPoint = 0;
		int maxLen = 1;
		for (int j = 1; j < s.length(); j++)
		{
			int t = testTwoSides(s, j, j);
			if (t > maxLen)
			{
				startPoint = j - t/2;
				maxLen = t;
			}
			t = testTwoSides(s, j-1, j);
			if (t > maxLen)
			{
				startPoint = j - t/2;
				maxLen = t;
			}
		}
		return s.substr(startPoint, maxLen);
	}
	
	int testTwoSides(string &s, int low, int up)
	{
		int n = s.length();
		int max = 0;
		if (low == up)
		{
			low--;
			up++;
			max = 1;
		}
		while (low>=0 && up<n && s[low] == s[up])
		{
			max+=2;
			low--;
			up++;
		}
		return max;
	}
};



leetCode网站上的分析的不错了:

http://leetcode.com/2011/11/longest-palindromic-substring-part-i.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode Longest Palindromic Substring 最长回文子字符串 两种方法分析解答 的相关文章

  • TXT文本删除第一行文本变成空要如何解决呢

    首先大家一起来看下这个TXT文本里面有多行内容 想把开头第一行批量删除不要掉 1 如果是一两个本可以手动删除也很方便哦 如果文本量比较大如几十几 几百个文本大家一直都选用 首助编辑高手 工具去批量操作哦 批量操作可以大大提高工作效率 接来看
  • 培训学习大数据知识有哪些方法

    学习大数据知识是当前非常热门的话题 随着大数据技术的不断发展 越来越多的人开始关注并学习大数据知识 在大数据培训班学习大数据知识是一个非常好的选择 下面我将从制定大数据学习计划 项目实战案例练习 以用为学 与培训班老师多交流等四个方面来详细
  • 实实在在万事达!实在智能助力山东万事达集团加速数智化转型

    近日 杭州实在智能科技有限公司 以下简称 实在智能 与山东建筑钢市场 领头羊 山东万事达控股有限公司 以下简称 万事达集团 召开 RPA 机器人流程自动化 项目启动会 实在智能携手万事达集团 联合共建财务RPA一体化研发管理项目 以下简称
  • 易点易动固定资产管理系统:集成飞书,助力企业全生命周期固定资产管理

    易点易动固定资产管理系统 集成飞书 助力企业全生命周期固定资产管理 在现代商业环境中 固定资产管理对企业的运营和发展至关重要 为了提高管理效率和降低成本 我们引入了易点易动固定资产管理系统 该系统集成了飞书 为企业提供全生命周期的固定资产管
  • 江河湖泊生态水文监测物联网解决方案

    方案背景 江湖湖泊具有重要的经济效益和生态效益 是重要的资源储备 近年来 各级积极采取措施 加强江河湖泊治理 管理和保护 在防洪 供水 发电 航运 养殖等方面的综合发展 随着纳入管理的江河湖泊等水体越来越多 范围越来越广 很多水污染 非法采
  • 门店总数超9000家,手握大众茶饮“下沉市场牌”的古茗冲刺上市

    奶茶品牌上市潮来袭 1月2日 奶茶品牌古茗控股有限公司 下称 古茗 蜜雪冰城股份有限公司 下称 蜜雪冰城 一同递交招股书 计划在港交所主板上市 近年来 随着现制茶饮的爆火 赛道内主流玩家的资本化脚步也逐渐加快 2021年6月 奈雪的茶 HK
  • 实时获取建材网商品数据:API实现详解与代码示例

    一 引言 随着电子商务的快速发展 实时获取商品数据对于企业决策 市场分析以及数据驱动的营销策略至关重要 建材网作为国内知名的建材信息平台 提供了API接口 使得第三方开发者可以方便地获取商品数据 本文将详细介绍如何使用 建材网的API接口
  • 天猫数据分析工具推荐(天猫第三方数据平台)

    在电商迅速发展的大背景下 做好天猫数据分析能够在多方面帮助品牌商家更好地运营店铺 塑造品牌 如通过数据分析了解消费者的需求 购买偏好 这有利于品牌商家及时调整商品结构 产品推广 商品宣传等等 灵活制定品牌的销售策略 那么 天猫平台行业 品牌
  • 神州信息一表通监管合规系统

    什么是 一表通 国家金融监督管理总局为进一步建立健全数据统计监管体系 规范数据报送指标体系 明确检测数据规则 而推行建立的一套新体系监管报送方式 提升校验准确性和信息安全性 近期 国家金融监督管理总局更是进一步加大推动 一表通 的实行试点范
  • 期权怎么开户:期权开户免费吗,需要什么样的门槛?

    期权开户是免费的 只有交易才会产生费用 开通期权账户需要满足50万的资金 以及融资融券交易经验或者金融期货交易经验 当然也有免50万门槛的开户方式 下文为大家科普期权怎么开户啊 期权开户免费么 一般情况下 期权是可以通过在营业部网点进行开户
  • 从不同维度的调研数据,看企业数字化转型

    数字化转型逐渐成为企业增长和价值创造的新引擎 然而 在复杂的背景下 企业数字化转型也面临着前所未有的挑战和机遇 未来 我们还能做些什么 怎么做 这成为了各企业高管当前亟需厘清的问题 企业做数字化转型的原因 总体来看 大部分受访企业做数字化转
  • AI大模型应用入门实战与进阶:如何训练自己的AI模型

    1 背景介绍 人工智能 Artificial Intelligence AI 是计算机科学的一个分支 旨在模拟人类智能的能力 包括学习 理解自然语言 识别图像和视频 进行决策等 随着数据量的增加和计算能力的提升 人工智能技术的发展得到了巨大
  • 流程管理的未来:人工智能如何改变业务运行

    1 背景介绍 流程管理是企业在实现业务目标时所采取的一系列有序 连贯的活动 它涉及到许多领域 如生产 销售 研发 财务等 随着企业规模的扩大和市场竞争的激烈 流程管理的复杂性也不断增加 人工智能 AI 技术的发展为流程管理提供了新的机遇 有
  • 线性代数在数据挖掘中的应用

    1 背景介绍 线性代数是数学的一个分支 主要研究的是线性方程组和向量的相关概念和方法 在数据挖掘领域 线性代数的应用非常广泛 包括数据处理 特征提取 模型训练等方面 本文将从以下几个方面进行阐述 背景介绍 核心概念与联系 核心算法原理和具体
  • 机器智能与人类智能的竞争:技术创新的驱动力

    1 背景介绍 人工智能 Artificial Intelligence AI 和机器学习 Machine Learning ML 是最近几年最热门的技术领域之一 随着数据量的增加和计算能力的提高 机器学习技术的发展得到了极大的推动 机器学习
  • 大数据毕业设计:python微博舆情分析系统+可视化+情感分析+爬虫+机器学习(源码)✅

    博主介绍 全网粉丝10W 前互联网大厂软件研发 集结硕博英豪成立工作室 专注于计算机相关专业 毕业设计 项目实战6年之久 选择我们就是选择放心 选择安心毕业 感兴趣的可以先收藏起来 点赞 关注不迷路 毕业设计 2023 2024年计算机毕业
  • 问CHAT很繁琐的问题会不会有答案呢?

    问CHAT 什么已有的基于极值理论的极端温度重现期主要针对极端高温事件 对极端低温事件研究较少 CHAT 回复 为这主要可能是由于以下几个原因 1 气候变化与全球变暖 当前 全球变暖和气候变化的问题备受关注 这导致科研者更加关注极端高温事件
  • 这个很少人知道的零售技巧,却是我最想安利的!

    在当今数字化浪潮的推动下 零售业正在迎来一场革命性的变革 新零售模式的崛起正引领着消费者与商品之间的互动方式发生深刻的变化 在这个变革的前沿 自动售货机作为新零售的一种关键形式 通过智能技术和自动化系统 重新定义了购物体验的边界 客户案例
  • 电商数据api拼多多接口获取商品实时数据价格比价api代码演示案例

    拼多多商品详情接口 接口接入入口 它的主要功能是允许卖家从自己的系统中快速获取商品详细信息 通过这个接口 卖家可以提取到商品的各类数据 包括但不限于商品标题 价格 优惠价 收藏数 下单人数 月销售量等 此外 还可以获取到商品的SKU图 详情
  • 实力认证!鼎捷软件荣膺“领军企业”和“创新产品”两大奖项

    近日 由中国科学院软件研究所 中科软科技股份有限公司联合主办的 2023中国软件技术大会 于北京成功举办 本届大会以 大模型驱动下的软件变革 为主题 数十位来自知名互联网公司和软件巨头企业的技术大咖 不同领域行业专家 畅销书作者等分享嘉宾

随机推荐