当前位置:网站首页>13. lt.647. Palindromic substring + lt.516. Longest palindrome subsequence
13. lt.647. Palindromic substring + lt.516. Longest palindrome subsequence
2022-08-03 05:10:00 【Caicai's big data development road】
lt.647. 回文子串
[案例需求]
[思路分析一, 暴力解法]
[代码实现]
[思路分析二, 动态规划]
- 确定dp数组以及下标的含义
boolean dp[i][j]: represents the range of[i, j] (Precautions Left closed and right closed)Whether the string of is a palindrome, 如果dp[i][j]为true, 否则为false;
- 确定递推公式
整体上是两种, 就是s[i]与s[j]相等, s[i]和s[j]不相等这两种.
当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false.
下标i 与 j相差为1,例如aa,也是回文子串
下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true.
- 递推公式如下
if (s[i] == s[j]) {
if (j - i <= 1) {
// 情况一 和 情况二
result++;
dp[i][j] = true;
} else if (dp[i + 1][j - 1]) {
// 情况三
result++;
dp[i][j] = true;
}
}
- result就是统计回文子串的数量.
- 注意这里我没有列出当s[i]与s[j]不相等的时候,因为在下面dp[i][j]初始化的时候,就初始为false.
- dp数组初始化
dp[i][j]可以初始化为true么? 当然不行,怎能刚开始就全都匹配上了.所以dp[i][j]初始化为false.
- 确定遍历顺序
for (int i = s.size() - 1; i >= 0; i--) {
// 注意遍历顺序
for (int j = i; j < s.size(); j++) {
if (s[i] == s[j]) {
if (j - i <= 1) {
// 情况一 和 情况二
result++;
dp[i][j] = true;
} else if (dp[i + 1][j - 1]) {
// 情况三
result++;
dp[i][j] = true;
}
}
}
}
- 举例推导
[代码实现]
class Solution {
public int countSubstrings(String s) {
int len, ans = 0;
if (s == null || (len = s.length()) < 1) return 0;
//dp[i][j]:s字符串下标i到下标j的字串是否是一个回文串,即s[i, j]
boolean[][] dp = new boolean[len][len];
for (int j = 0; j < len; j++) {
for (int i = 0; i <= j; i++) {
//当两端字母一样时,才可以两端收缩进一步判断
if (s.charAt(i) == s.charAt(j)) {
//i++,j--,即两端收缩之后i,j指针指向同一个字符或者i超过j了,必然是一个回文串
if (j - i < 3) {
dp[i][j] = true;
} else {
//否则通过收缩之后的字串判断
dp[i][j] = dp[i + 1][j - 1];
}
} else {
//两端字符不一样,不是回文串
dp[i][j] = false;
}
}
}
//遍历每一个字串,统计回文串个数
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
if (dp[i][j]) ans++;
}
}
return ans;
}
}
lt.516.最长回文子序列
[案例需求]
[思路分析]
[代码实现]
public class Solution {
public int longestPalindromeSubseq(String s) {
int len = s.length();
int[][] dp = new int[len + 1][len + 1];
for (int i = len - 1; i >= 0; i--) {
// 从后往前遍历 保证情况不漏
dp[i][i] = 1; // 初始化
for (int j = i + 1; j < len; j++) {
if (s.charAt(i) == s.charAt(j)) {
dp[i][j] = dp[i + 1][j - 1] + 2;
} else {
dp[i][j] = Math.max(dp[i + 1][j], Math.max(dp[i][j], dp[i][j - 1]));
}
}
}
return dp[0][len - 1];
}
}
边栏推荐
- [Harmony OS] [ArkUI] ets development graphics and animation drawing
- 在线密码生成工具推荐
- MySQL 出现 The table is full 的解决方法
- 社交电商:流量红利已尽,裂变营销是最低成本的获客之道
- 表的创建、修改与删除
- 打破传统电商格局,新型社交电商到底有什么优点?
- presto安装部署教程
- Two ways to simulate multi-user login in Jmeter
- Kotlin-Flow common encapsulation class: the use of StateFlow
- 数字化时代,企业如何建立自身的云平台与商业模式的选择?
猜你喜欢
Unity2D horizontal board game tutorial 6 - enemy AI and attack animation
idea使用@Autowired注解爆红原因及解决方法
【Harmony OS】【ArkUI】ets开发 图形与动画绘制
阿里云对象存储oss私有桶生成链接
Concepts and Methods of Exploratory Testing
接口测试框架实战(四)| 搞定 Schema 断言
mysql 创建索引的三种方式
[Harmony OS] [ArkUI] ets development graphics and animation drawing
Shell之条件语句
接口和协议
随机推荐
接口测试框架实战(四)| 搞定 Schema 断言
13.< tag-动态规划和回文字串>lt.647. 回文子串 + lt.516.最长回文子序列
在树莓派上搭建属于自己的网页(1)
Unity2D horizontal board game tutorial 6 - enemy AI and attack animation
js中的闭包
MCM box model modeling method and source analysis of atmospheric O3
内部类、static关键字、final
[Harmony OS] [ARK UI] ETS context basic operations
【HMS core】【Ads Kit】Huawei Advertising——Overseas applications are tested in China. Official advertisements cannot be displayed
How to prepare for the test interface test data
WebSocket的实际应用
Technology Sharing | How to do assertion verification for xml format in interface automation testing?
js garbage collection mechanism
荧光标记多肽FITC/AMC/FAM/Rhodamine/TAMRA/Cy3/Cy5/Cy7-Peptide
Practical application of WebSocket
BIOTIN ALKYNE CAS:773888-45-2价格,供应商
Exception(异常) 和 Error(错误)区别解析
Secondary development of WinForm controls
接口测试框架实战 | 流程封装与基于加密接口的测试用例设计
【开发者必看】【push kit】推送服务服务典型问题合集2