【动态规划】回文串问题

server/2024/12/22 19:58:36/

1.回文子串

回文子串

代码:

class Solution {
public:int countSubstrings(string s) {int n = s.size();vector<vector<bool>> dp(n, vector<bool>(n));int ret = 0;for(int i = n - 1; i >= 0; i--){for(int j = i; j < n; j++){if(s[i] == s[j])dp[i][j] = i + 1 < j ? dp[i + 1][j - 1] : true;if(dp[i][j])ret++;}}return ret;}
};

2.最长回文子串

最长回文子串

代码:

class Solution {
public:string longestPalindrome(string s) {int n = s.size();vector<vector<bool>> dp(n, vector<bool>(n));int len = 1, begin = 0;for(int i = n - 1; i >= 0; i--){for(int j = i; j < n; j++){if(s[i] == s[j])dp[i][j] = i + 1 < j ? dp[i + 1][j - 1] : true;if(dp[i][j] && j - i + 1 > len)begin = i, len = j - i + 1;}}return s.substr(begin, len);}
};

 3.分割回文串iv

分割回文串iv

 

 代码:

class Solution {
public:bool checkPartitioning(string s) {//用dp表把所有的子串是否是回文预处理一下int n = s.size();vector<vector<bool>> dp(n, vector<bool>(n));for(int i = n - 1; i >= 0; i--)for(int j = i; j < n; j++)if(s[i] == s[j])dp[i][j] = i + 1 < j ? dp[i + 1][j - 1] : true;//枚举所有的第二个字符串的起始位置和结束位置for(int i = 1; i < n - 1; i++)for(int j = i; j < n - 1; j++)if(dp[0][i - 1] && dp[i][j] && dp[j + 1][n - 1])return true;return false;}
};

4.分割回文串ii

分割回文串ii

 代码:

class Solution {
public:int minCut(string s) {// 预处理,统计所有子串是否是回文int n = s.size();vector<vector<bool>> isPal(n, vector<bool>(n));for(int i = n - 1; i >= 0; i--)for(int j = i; j < n; j++)if(s[i] == s[j])isPal[i][j] = i + 1 < j ? isPal[i + 1][j - 1] : true;vector<int> dp(n, INT_MAX);for(int i = 0; i < n; i++){if(isPal[0][i]) dp[i] = 0;else{for(int j = 1; j <= i; j++){if(isPal[j][i])dp[i] = min(dp[i], dp[j - 1] + 1);}}}return dp[n - 1];}
};

5.最长回文子序列

最长回文子序列

代码:

class Solution {
public:int longestPalindromeSubseq(string s) {int n = s.size();vector<vector<int>> dp(n, vector<int>(n));for(int i = n - 1; i >= 0; i--){dp[i][i] = 1;for(int j = i + 1; j < n; j++){if(s[i] == s[j]) dp[i][j] = dp[i + 1][j - 1] + 2;else dp[i][j] = max(dp[i][j - 1], dp[i + 1][j]);}}return dp[0][n - 1];}
};

 6.让字符串成为回文串的最少插入次数

让字符串成为回文串的最少插入次数

代码:

 

class Solution {
public:int minInsertions(string s) {int n = s.size();vector<vector<int>> dp(n, vector<int>(n));for(int i = n - 1; i >= 0; i--){for(int j = i + 1; j < n; j++){if(s[i] == s[j]) dp[i][j] = dp[i + 1][j - 1];else dp[i][j] = min(1 + dp[i + 1][j], 1 + dp[i][j - 1]);}}return dp[0][n - 1];}
};


http://www.ppmy.cn/server/114268.html

相关文章

用Python实现时间序列模型实战——Day 15: 时间序列模型的选择与组合

一、学习内容 1. 模型选择的标准与方法&#xff08;如 AIC、BIC&#xff09; 在时间序列建模中&#xff0c;模型的选择是非常重要的&#xff0c;常用的模型选择标准包括 AIC (Akaike Information Criterion) 和 BIC (Bayesian Information Criterion)。 AIC (Akaike Informat…

手机变身无线话筒

目录 一、APP安装 二、蓝牙连接 三、使用 四、设置 近日学校给教室内安装了贝德的吸顶音响,声音洪亮不刺耳,前后排学生都清晰听到我的声音,上课轻松了很多。 不过这个360吸顶音箱使用无线耳麦,需要定时充电,我总怕没电,每次下班都给它充上电。

计算机网络10——数据库语法1

目录 1、sql语句执行顺序 2、多表查询 3、写sql的步骤 4、去重 5、视图 6、自定义函数:function 7、调用函数 1、sql语句执行顺序 一般情况下:1、from 2、where 3、select 如果有分组和having:from 分组 having最后执行 2、多表查询 内联:select * from 表1 inne…

PostgreSQL技术内幕7:PostgreSQL查询编译

文章目录 0.简介1.整体过程2.查询分析2.1 Lex2.2 Yacc2.3 PG词法分析和语法分析介绍2.4 PG语义分析 4.查询优化4.1 预处理4.1.1 提升子链接和子查询4.1.2 预处理表达式4.1.3 处理HAVING子句 4.2 改进查询树4.2.1 路径生成4.2.2 代价估计 4.3 计划生成 0.简介 一次完整的SQL执行…

一台笔记本电脑的硬件都有哪些以及对应的功能

一台笔记本电脑的硬件通常包括多个关键组件&#xff0c;这些组件共同协作&#xff0c;确保电脑的正常运行。以下是笔记本电脑的主要硬件及其功能&#xff1a; 1. 中央处理器&#xff08;CPU&#xff09; 功能&#xff1a;CPU 是电脑的“大脑”&#xff0c;负责处理所有的计算…

分类预测|基于黑翅鸢优化轻量级梯度提升机算法数据预测Matlab程序BKA-LightGBM多特征输入多类别输出 含对比

分类预测|基于黑翅鸢优化轻量级梯度提升机算法数据预测Matlab程序BKA-LightGBM多特征输入多类别输出 含对比 文章目录 一、基本原理BKA&#xff08;Black Kite Algorithm&#xff09;的原理LightGBM分类预测模型的原理BKA与LightGBM的模型流程总结 二、实验结果三、核心代码四、…

mycat双主高可用架构部署-MySQL5.7环境部署第一台

MySQL5.7服务器IP是192.168.31.209及192.168.31.210 1、192.168.31.209:3307实例部署 a、配置文件 mkdir -p /data/mysql/mysql3307/{data,logs} #创建MySQL数据及日志目录 vi /data/mysql/mysql3307/my3307.cnf #配置文件整理 [client] #password your_password port …

综合自动化变电所运行的可靠性

摘 要&#xff1a;自动化技术在变电所中的有效利用&#xff0c;一方面能够通过网络信息平台落实远程变电操控的需要&#xff0c;使变电所的工作质量与效率得到显著提升&#xff0c;并增强变电系统的可控性&#xff1b;另一方面&#xff0c;凭借可靠性检测措施&#xff0c;更便于…