数据结构基础day9

news/2025/3/26 13:45:36/

题目:187. 重复的DNA序列

解法1:哈希表

class Solution {
public:vector<string> findRepeatedDnaSequences(string s) {vector<string> ans;unordered_map<string, int> mp;int n=s.size(), L=10;for(int i=0; i<=n-L; ++i){	//从开头遍历到最后一个长度为10的子串开头string temp = s.substr(i,L);if(++mp[temp]==2){	//当数量==2时即可加入答案序列ans.push_back(temp);}}return ans;}
};

解法2:哈希表+滑动窗口+位运算

好长,不想看

题目:5. 最长回文子串

解法1:暴力解法

遍历每一个子串,当其是回文子串且长度最大,存储初始位置和长度。
时间复杂度O(n^3),空间复杂度O(1)

class Solution {
public:bool isPalindrome(string s, int left, int right){	//判断s字符串中left到right位置的子串是否为回文串while(left<right){if(s[left] != s[right]) return false;++left; --right;}return true;}string longestPalindrome(string s) {int n = s.size();if(n<2) return s;	//特判int maxLen = 1;	//最大长度可以是一个字母int begin = 0;	//初始位置for(int i=0; i<n-1; ++i){	//遍历头,注意遍历到n-1for(int j=i+1; j<n; ++j){	//遍历从i开始的子串的尾,if(j-i+1>maxLen && isPalindrome(s, i, j)){	//当子串长度大于当前最大长度,且子串为回文串maxLen = j-i+1;	//更新最大长度begin = i;	//更新起始位置}}}return s.substr(begin, maxLen);	//返回s的最大长度回文子串}
};

解法2:动态规划

相当于在暴力解法的基础上空间换时间,时间复杂度O(n^2),空间复杂度O(n)
状态定义(定义子问题):一个字符串是否是回文串看去掉两头字符后的字符串是否是回文串,因此子问题定义为:dp[i][j]表示s[i,...,j]为回文子串
状态转移方程(描述子问题之间的联系)dp[i][j] = (s[i]==s[j]) && (dp[i+1][j-1]=true)
初始化:边界条件就是当子串长度为1的时候,显然是回文子串,比如,ij的一个子串在i和j位置的字符相同时,判断去掉ij位置字符后的子串长度是否是回文子串,一致判断到去掉ij位置字符后的子串长度小于2,即j-1-(i+1)+1<2 -> j-i<3
输出dp[i][j]表示ij的子串是否是回文子串,判断j-i+1是否大于maxLen,如果大于,记录maxLenbegin=i
优化空间:见解法3中心拓展法
PS:注意都是先确定起始位置和长度,最后再截取最长回文子串
在这里插入图片描述

class Solution {
public:string longestPalindrome(string s) {int n = s.size();if(n<2) return s;	//特判int maxLen = 1;	//最大回文子串长度int begin = 0;	//最大回文子串起始位置vector<vector<int>> dp(n, vector<int>(n));	//dp定义,true是非0数,false是0for(int i=0; i<n; ++i){	//初始定义,每个字符单独都是回文子串,对角线为truedp[i][i] = true;}for(int j=1; j<n; ++j){	//从左上角开始遍历,注意从1开始,先遍历列for(int i=0; i<j; ++i){	//后遍历行,到对角线(j)为止if(s[i]!=s[j]) dp[i][j]=false;	//如果i和j位置的字符不相同,则直接falseelse{	//i和j位置字符相同if(j-i<3){  //边界:j-1-(i+1)+1<2 -> j-i<3dp[i][j] = true;}else{	//继续判断i+1到j-1的子串dp[i][j] = dp[i+1][j-1];}}if(dp[i][j]==true && j-i+1>maxLen){	//检查i到j子串长度是否大于maxLenmaxLen = j-i+1;	//更新最大回文子串长度begin = i;	//更新最大回文子串初始位置}}}return s.substr(begin, maxLen);	//截取最长回文子串}
};

解法3:中心扩展法

时间复杂度:O(n^2),空间复杂度:O(1)
枚举中心位置的个数2(n-1),每个中心向两边扩散看是否为回文子串,偶数回文子串和奇数回文子串

class Solution {
public:int ExpandfromCentre(string s, int i, int j){	//从中心开始扩展,检查扩展子串是否是回文子串int n = s.size();int left = i, right = j;while(left>=0 && right<n){if(s[left]==s[right]){--left;++right;}else{break;}}   //不符合i和j位置的字符相同时退出循环,因此返回的回文子串的长度为j-1-(i+1)+1=j-i-1,这里是left和right!!!return right-left-1;}string longestPalindrome(string s) {int n = s.size();if(n<2) return s;	//特判int maxLen = 1;	//最大回文子串长度int begin = 0;	//最大回文子串起始位置for(int i=0; i<n-1; ++i){	//枚举中心位置int oddLen = ExpandfromCentre(s, i, i);	//最大奇数回文子串长度int evenLen = ExpandfromCentre(s, i, i+1);	//最大偶数回文子串长度if(max(oddLen, evenLen) > maxLen){	//更新maxLen和beginmaxLen = max(oddLen, evenLen);begin = i-(maxLen-1)/2;	//注意这里是推导出来的}}return s.substr(begin, maxLen);	//截取最长回文子串}
};

从i和maxLen倒推begin有点麻烦,可以选另一个写法:

class Solution {
public:pair<int, int> ExpandfromCentre(string s, int i, int j){	//注意函数类型是pairint n = s.size();int left = i, right = j;while(left>=0 && right<n){if(s[left]==s[right]){--left;++right;}else{break;}}   //不符合i和j位置的字符相同时退出循环,因此返回的回文子串的长度为j-1-(i+1)+1=j-i-1,这里是left和right!!!return {left+1, right-1};	//注意返回值和{}}string longestPalindrome(string s) {int n = s.size();if(n<2) return s;	//特判int maxLen = 1;	//最大回文子串长度int begin = 0;	//最大回文子串起始位置for(int i=0; i<n-1; ++i){auto [odd_l, odd_r] = ExpandfromCentre(s, i, i);	//注意加[]auto [even_l, even_r] = ExpandfromCentre(s, i, i+1);if(odd_r-odd_l+1 > maxLen){maxLen = odd_r-odd_l+1;begin = odd_l;}if(even_r-even_l+1 > maxLen){maxLen = even_r-even_l+1;begin = even_l;}}return s.substr(begin, maxLen);	//截取最长回文子串}
};

http://www.ppmy.cn/news/56735.html

相关文章

【c语言小项目】基于easyX的俄罗斯方块

EeayX是针对 C/C 的简单图形库插件&#xff0c;本项目基于easyX游戏框架下实现俄罗斯方块游戏。 俄罗斯方块功能实现中主要运用了二维数组的循环遍历。能够实现基本功能&#xff0c;暂未实现旋转 c语言系列专栏&#xff1a;c语言之路重点知识整合 更多相关&#xff1a;c语…

Linux安装离线版MySql客户端

本文采用rpm安装方式。 下载文件&#xff1a; mysql-community-libs-5.7.41-1.el7.x86_64 mysql-community-common-5.7.41-1.el7.x86_64 mysql-community-client-5.7.41-1.el7.x86_64 本文件可以在MYSQL官网进行下载 MySQL :: Download MySQL Community Server (Archive…

Baumer工业相机堡盟相机如何使用偏振功能(偏振相机优点和行业应用)(C#)

项目场景&#xff1a; Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0…

外卖项目优化-01-redis缓存短信验证码、菜品数据、Spring Cache(注解开发缓存)、(注解开发)缓存套餐数据

文章目录 外卖项目优化-01课程内容前言1. 环境搭建1.1 版本控制解决branch和tag命名冲突 1.2 环境准备 2. 缓存短信验证码2.1 思路分析2.2 代码改造2.3 功能测试 3. 缓存菜品信息3.1 实现思路3.2 代码改造3.2.1 查询菜品缓存3.2.2 清理菜品缓存 3.3 功能测试3.4 提交并推送代码…

Vue(标签属性:ref、配置项:props、混入mixin、插件、样式属性:scroped)

一、ref&#xff08;打标识&#xff09; 前面提及到了标签属性&#xff1a;keys 这里将了解ref&#xff1a;打标识 正常布置脚手架并创建入口文件main.js,引入组件 1. 可以给元素注册引用信息&#xff08;获取真实DOM&#xff09; 给一个按钮获取上方的dom的方法&#xff0c;方…

C++---区间DP---加分二叉树(每日一道算法2023.4.28)

题目&#xff1a; 设一个 n 个节点的二叉树 tree 的中序遍历为&#xff08;1,2,3,…,n&#xff09;&#xff0c;其中数字 1,2,3,…,n 为节点编号。 每个节点都有一个分数&#xff08;均为正整数&#xff09;&#xff0c;记第 i 个节点的分数为 di&#xff0c;tree 及它的每个子…

【Celery】任务Failure或一直超时Pending

编写背景 task进入队列后&#xff0c;部分任务出现Failure或者一直Pending,且业务代码没有报错。 运行环境 celery配置 from celery import Celery broker redis://:127.0.0.1:6379/1 backend redis://:127.0.0.1:6379/2 app Celery(brokerbroker,backendbackend,includ…

卷积相关知识

二维图片卷积 二维卷积可以处理二维数据 nn.Conv2d(self, in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue)) 参数&#xff1a;   in_channel: 输入数据的通道数&#xff0c;例RGB图片通道数为3&#xff1b;   out_channel: 输…