当前位置:网站首页>回文相关题目
回文相关题目
2022-07-23 08:03:00 【ATTACH_Fine】
647. 回文子串
题目
给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符 是正着读和倒过来读一样的字符串。子字符串是字符串中的由连续字符组成的一个序列。
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。
示例:
思路
1.确定dp数组(dp table)以及下标的含义
布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。
2. 确定递推公式
s[i]与s[j]不相等 return false;
s[i]与s[j]相等
情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串 i==j
情况二:下标i 与 j相差为1,例如aa,也是回文子串 j - i == 1
情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看**dp[i + 1][j - 1]**是否为true。
3.初始化
4.确定遍历顺序
情况三是根据dp[i + 1][j - 1]是否为true,在对dp[i][j]进行赋值true的。dp[i + 1][j - 1] 在 dp[i][j]的左下角,如图:
一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的。
代码
class Solution {
public int countSubstrings(String s) {
//动态规划 dp[i][j] 代表[i,j]区间内是否是回文字符
//dp[i][j]由dp[i-1][j+1]决定
int len = s.length();
boolean[][] dp = new boolean[len][len];
int res = 0;
//从下到上,从左到右遍历
for(int i = len-1; i >= 0; i--){
for(int j = i; j < len; j++){
if(s.charAt(i) == s.charAt(j)){
//(s.charAt(i)==s.charAt(j) 时,当元素个数为1,2,3个时,一定为回文子串
if(j - i <= 1){
res++;
dp[i][j] = true;
}else if(dp[i+1][j-1] == true){
res++;
dp[i][j] = true;
}
}
}
}
return res;
}
}
516. 最长回文子序列
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例:
思路
1.确定dp数组(dp table)以及下标的含义
dp[i][j]:字符串s在**[i, j]范围**内最长的回文子序列的长度为dp[i][j]。
2.确定递推公式
在判断回文子串的题目中,关键逻辑就是看s[i]与s[j]是否相同。
(1)如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;
(2)如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子串的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。
加入s[j]的回文子序列长度为dp[i + 1][j]。
加入s[i]的回文子序列长度为dp[i][j - 1]。
dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
3.初始化
首先要考虑当i 和j 相同的情况,从递推公式:dp[i][j] = dp[i + 1][j - 1] + 2; 可以看出 递推公式dp[i][j]是计算不到 i 和j相同时候的情况。
所以需要手动初始化一下,当i与j相同,那么dp[i][j]一定是等于1的,即:一个字符的回文子序列长度就是1。
其他情况dp[i][j]初始为0就行,这样递推公式:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); 中dp[i][j]才不会被初始值覆盖。
4.确定遍历顺序
所以遍历i的时候一定要从下到上遍历,这样才能保证,下一行的数据是经过计算的。
代码
class Solution {
public int longestPalindromeSubseq(String s) {
//动态规划 dp[i][j]代表在[i,j]上最长的回文子序列的长度
int len = s.length();
int[][] dp = new int[len+1][len+1];
//从下到上,从左到右遍历
for(int i = len-1; i >= 0; i--){
for(int j = i+1; j < len; j++){
//当i和j相同时初始化
dp[i][i] = 1;
if(s.charAt(i) == s.charAt(j)){
dp[i][j] = dp[i+1][j-1] + 2;
}else{
dp[i][j] = Math.max(dp[i][j-1],dp[i+1][j]);
}
}
}
return dp[0][len-1];
}
}
边栏推荐
- What level of rtx3070ti graphics card? What level of rtx3070ti graphics card? How about rtx3070ti graphics card
- Detailed introduction of RIP
- Spark counts new users every day
- Where does pytorch work?
- ERP production operation control
- STM32 output sine wave +cubemx configuration +hal Library
- LabVIEW运行中改变Chart的历史长度
- Notes on key vocabulary of the original English book biography of jobs (15) [chapter four]
- 第十一天笔记
- 数据库连接池 & DBUtils
猜你喜欢

锐龙R7 PRO 6850H核显性能怎么样?相当于什么水平

Day 8 notes

Rip experiment

Detailed explanation of knapsack problem

STM32输出正弦波+cubeMX配置+HAL库

Which is the difference between iqoo 10 pro and vivo X80 pro? Detailed parameter configuration comparison

第八天笔记

rtx3090ti什么水平 rtx3090ti显卡什么级别 rtx3090ti显卡怎么样

英特尔赛扬7305性能怎么样?相当于什么水平级别

Where does pytorch work?
随机推荐
Swift hex string to uicolor
Where does pytorch work?
iQOO 10 Pro和小米12 Ultra哪个好 哪个值得买 两者配置对比
How about the performance of Intel Celeron 7300? What level is it equivalent to
STM32 outputs SPWM wave, Hal library, cubemx configuration, and outputs 1kHz sine wave after filtering
Comment creo 9.0 modifie - t - il rapidement le système de coordonnées Cao?
Notes on the fifth day
第七天笔记
锐龙R7 PRO 6850H核显性能怎么样?相当于什么水平
利用redis实现分布式锁(单个redis)
Notes on the ninth day
AppScan的安装与使用
How about the performance of Ruilong R7 Pro 5875u? What level is it equivalent to
英特尔赛扬7305性能怎么样?相当于什么水平级别
Talent evaluation Core i7 12850hx and i7 12700h which to choose
Renforcement de l'apprentissage - points de compréhension du gradient stratégique
js 实现随机生成UUID
Kafka consumption reports an error coordinator unavailable Rediscovery will be attempt redisCovery
Description of test platform and hardware design
BGP federal experiment