当前位置: 首页 > news >正文

超级码力在线编程大赛初赛第1场-4-对称前后缀题解

目录

    • 题目描述
    • 示例
      • 输入
      • 输出
    • 说明
    • 题解
    • 代码

在这里插入图片描述

题目描述

给定一个字符串s。 我们令一个字符串的权值为一个字符串的最长对称前后缀长度。 请求出s的所有子串的权值的总和。 例如,“abcxyzcba” 的最长对称前后缀的长度为3,因为 “abc” 和 “cba” 对称。

字符串的长度为n,1<=n<=3*1e3。 字符串均由小写英文字符组成。

示例

输入

“bacbdab”

输出

12

说明

样例中,单个字符的子串的权值为1,它们的和为7。 另外的权值为: “bacb” -> 1,“bacbdab” -> 2,“bdab” -> 1,“acbda” -> 1,所以权值和为12。

题解

虽然题目中没有明确限制运行时间,但时间复杂度太高会超时。如果用暴力法,首先以O(N2)得到每个子串,之后以O(N)求每个子串的权值,也就是最大对称长度。这样时间复杂度达到了O(N3)。

可以使用动态规划进行优化。我们发现,每个子串的权值可以由它本身的字串的权值求出,因此我们令dp[i][j]为下标为i到下标为j构成的字串的权值。状态转移方程为:

dp[i][j]=1, i=j
dp[i][j]=2, i+1=j && s[i]=s[j]
dp[i][j]=dp[i+1][j-1]+1, s[i]=s[j] && i+1<j
dp[i][j]=0, else

分别对应四种情况:

单个字符,如a
两个相同字符,如aa
三个及以上字符,首尾相同,如abca

注意到一个特殊情况:对于形如aba的字串,它的权值应该为3,但按照我们的状态转移方程,dp(“aba”)=dp(“b”)+1=2。

这种情况可以概括为:字串长度等于其权值,则dp[i][j]=dp[i+1][j-1]+2。这种情况特殊处理就好。

具体过程中,因为每一个问题取决于规模更小(i与j更为接近)的子问题,因此先处理小问题,再处理大问题。所以我选择使用for循环,从小到大遍历i与j的距离d。代码如下:

代码

class Solution {
	public:
		long long suffixQuery(string &s) {
			int len=s.length();
			long long dp[len][len];
			long long sum=0;
			for(int i=0; i<len; i++) {
				dp[i][i]=1;
				sum++;
			}
			for(int d=1; d<len; d++) {
				for(int i=0; i<len&&i+d<len; i++) {
					//现在求dp[i][i+d]
					if(d==1) {
						if(s[i]==s[i+d]) {
							sum+=2;
							dp[i][i+d]=2;
						} else {
							dp[i][i+d]=0;
						}
					} else {
						if(s[i]==s[i+d]) {
							if(dp[i+1][i+d-1]==d-1) {
								dp[i][i+d]=2+dp[i+1][i+d-1];
								sum+=dp[i][i+d];
							} else {
								dp[i][i+d]=1+dp[i+1][i+d-1];
								sum+=dp[i][i+d];
							}

						} else {
							dp[i][i+d]=0;
						}
					}
				}
			}
			return sum;
		}

};

相关文章:

  • C++程序设计:相邻数对
  • C++程序设计:字符阵列(三角形字符阵列图形的打印)
  • C++程序设计:相反数
  • C++程序设计:折叠方阵
  • C++程序设计:消除类游戏
  • MaxDSNSize 未设置
  • C++程序设计:图像旋转
  • C++程序设计:分解质因数
  • 设置NTFS权限以避免通过webshell遍历主机目录(原创)
  • C++程序设计:打印杨辉三角形
  • 如何安装一个安全的动网(转)
  • C++程序设计:字符图形输出(数字三角形)
  • 远程分析IIS设置(转)
  • C++程序设计:字符图形输出(空白三角形)
  • 规律化生活一周
  • Angular6错误 Service: No provider for Renderer2
  • Apache的基本使用
  • bootstrap创建登录注册页面
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Java知识点总结(JavaIO-打印流)
  • jquery cookie
  • React的组件模式
  • Vue2 SSR 的优化之旅
  • 阿里云购买磁盘后挂载
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 检测对象或数组
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 你真的知道 == 和 equals 的区别吗?
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用SAX解析XML
  • 再次简单明了总结flex布局,一看就懂...
  • 责任链模式的两种实现
  • Prometheus VS InfluxDB
  • 带你开发类似Pokemon Go的AR游戏
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (11)MATLAB PCA+SVM 人脸识别
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (ros//EnvironmentVariables)ros环境变量
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (第一天)包装对象、作用域、创建对象
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (十五)使用Nexus创建Maven私服
  • (推荐)叮当——中文语音对话机器人
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (五)网络优化与超参数选择--九五小庞
  • (转)Sql Server 保留几位小数的两种做法
  • (转载)从 Java 代码到 Java 堆
  • .bat批处理出现中文乱码的情况
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net Stream篇(六)
  • .net 发送邮件