利用动态规划法、中心扩展法解决回文子串

2023-12-29 09:44

本文主要是介绍利用动态规划法、中心扩展法解决回文子串,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

利用动态规划法、中心扩展法解决回文子串

  • 动态规划法:1.确定dp[][],对角线是true(因为单个字母为回文串)

  • 2.枚举子串长度,从底至右上角填完表格

  • 3.当Si!=Sj时,false,当Si==Sj时,当最多3个字母为true,当大于3个字母取决于S[i+1,j-1]

    在这里插入图片描述

  • 中心扩展法:1.边界情况为1个字母或者2个字母,扩展

  • 2.当扩展到两边字母不一致时,停止扩展

    在这里插入图片描述

5 最长回文子串

/*** 最长回文子串*/
public class $5 {public String longestPalindrome(String s) {int len = s.length();if (len < 2) { //注意return s;}boolean[][] dp = new boolean[len][len];//初始化,所有长度为1的子串都是回文串,斜对角线为truefor (int i = 0; i < len; i++) {dp[i][i] = true;}int maxLen = 1; //注意int begin = 0;//先枚举子串长度for (int L = 2; L <= len; L++) { //L<=len 注意//枚举左边界for (int i = 0; i < len; i++) {//确定右边界int j = L+i-1;//如果右边界越界,则退出当前循环if (j >= len) {break;}//当s的第i和第j个字母不同时,不是回文串if (s.charAt(i) != s.charAt(j)) {dp[i][j] = false;} else { //当s的第i和第j个字母相同时if (j-i<3) { //最多3个字母时,肯定是是回文串dp[i][j] = true;} else { //大于3个字母时,取决于s[i+1,j-1]是否为回文串dp[i][j] = dp[i+1][j-1];}}if (dp[i][j] && j-i+1 > maxLen) {maxLen = j-i+1;begin = i;}}}return s.substring(begin, begin+maxLen); //begin+maxLen 注意}
}
/*** 最长回文子串*/
public class $5 {//中心扩展法public String longestPalindrome2(String s) {
//        if (s == null || s.isEmpty()) {
//            return "";
//        }int start = 0;int end = 0;for (int i = 0; i < s.length(); i++) {//偶数和奇数长度的回文串是不同的情况,同时考虑int len1 = expandAroundCenter(s, i, i);int len2 = expandAroundCenter(s, i, i+1);int len = Math.max(len1, len2);//时刻保证最长的回文长度//以i为中心,扩展len的长度,若len为奇数,则i左右长度相等,若len为偶数,则i左比i右少1if (len > end - start) {start = i - (len-1)/2;end = i + len/2;}}return s.substring(start, end+1);}private int expandAroundCenter(String s, int left, int right) {//针对i不断扩展,若两边值相等,则可以继续扩展while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {left--;right++;}return right - left - 1;}
}

647 回文子串

/*** 回文子串*/
public class $647 {public int countSubstrings(String s) {int len = s.length();boolean[][] dp = new boolean[len][len];int res = 0;for (int i = 0; i < len; i++) {dp[i][i] = true;res++;}for (int l = 2; l <= len; l++) {for (int i = 0; i < len; i++) {int j =  i+l-1;if (j >= len) {break;}if (s.charAt(i) == s.charAt(j)) {if (j - i < 3) {dp[i][j] = true;} else {dp[i][j] = dp[i+1][j-1];}} else {dp[i][j] = false;}if (dp[i][j]) {res++;}}}return res;}
}
/*** 回文子串*/
public class $647 {//扩展法public int countSubstrings2(String s) {int cnt = 0;for (int i = 0; i < s.length(); i++) {cnt += expand(s, i, i);cnt += expand(s, i, i+1);}return cnt;}private int expand(String s, int left, int right) {int cnt = 0;while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {left--;right++;cnt++;}return cnt;}
}

这篇关于利用动态规划法、中心扩展法解决回文子串的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/549120

相关文章

跨国公司撤出在华研发中心的启示:中国IT产业的挑战与机遇

近日,IBM中国宣布撤出在华的两大研发中心,这一决定在IT行业引发了广泛的讨论和关注。跨国公司在华研发中心的撤出,不仅对众多IT从业者的职业发展带来了直接的冲击,也引发了人们对全球化背景下中国IT产业竞争力和未来发展方向的深思。面对这一突如其来的变化,我们应如何看待跨国公司的决策?中国IT人才又该如何应对?中国IT产业将何去何从?本文将围绕这些问题展开探讨。 跨国公司撤出的背景与

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

poj2406(连续重复子串)

题意:判断串s是不是str^n,求str的最大长度。 解题思路:kmp可解,后缀数组的倍增算法超时。next[i]表示在第i位匹配失败后,自动跳转到next[i],所以1到next[n]这个串 等于 n-next[n]+1到n这个串。 代码如下; #include<iostream>#include<algorithm>#include<stdio.h>#include<math.

poj3261(可重复k次的最长子串)

题意:可重复k次的最长子串 解题思路:求所有区间[x,x+k-1]中的最小值的最大值。求sa时间复杂度Nlog(N),求最值时间复杂度N*N,但实际复杂度很低。题目数据也比较水,不然估计过不了。 代码入下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

csu1328(近似回文串)

题意:求近似回文串的最大长度,串长度为1000。 解题思路:以某点为中心,向左右两边扩展,注意奇偶分开讨论,暴力解即可。时间复杂度O(n^2); 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>#include<string>#inclu

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO