如何编写代码实现一个字符串的最长回文子串
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍"如何编写代码实现一个字符串的最长回文子串",在日常操作中,相信很多人在如何编写代码实现一个字符串的最长回文子串问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家
千家信息网最后更新 2025年01月18日如何编写代码实现一个字符串的最长回文子串
这篇文章主要介绍"如何编写代码实现一个字符串的最长回文子串",在日常操作中,相信很多人在如何编写代码实现一个字符串的最长回文子串问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何编写代码实现一个字符串的最长回文子串"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
/** * @author pxu * @create 2021/4/7-2:28 下午 */public class Nc017 { public static void main(String[] args) { String str = "abc1234321ab"; Nc017 nc017 = new Nc017(); int longestPalindrome = nc017.getLongestPalindrome(str, str.length()); System.out.println(longestPalindrome); } public int getLongestPalindrome(String A, int n) { /** * 这个问题用的是从上而下的动态规划求解方法,讲求字符串A的最长回文子序列问题, * 转换成三个子问题:求A.sutString(1,A.length)、求A.sutString(0,A.length-1) * 以及A.sutString(1,A.length-1)三种情况的解,并比较三种情况的解,得到最优解 * * 首先验证参数合法性,在定义一个二维数组用于记录已经求结果的子问题的解,主要的求解过程 * 在helper方法中 */ switch (n) { case 0: return 0; case 1: return 1; default: { Optimum[][] dp = new Optimum[n][n]; Optimum optimum = helper(A, dp, 0, n - 1); return optimum.len; } } } public Optimum helper(String theStr, Optimum[][] solArr, int start, int end) { /** * 此方法的最终返回结果 */ Optimum res = null; /** * 参数不合法直接返回null */ if(start<0 || end<0 || start>=solArr.length || end>=solArr.length || start > end) return null; else { /** * 如果当前子问题已经被求结果,直接返回在dp中记录的结果 */ if(solArr[start][end]!=null) { return solArr[start][end]; } else if (start == end) { /** * 用于处理只有一个字符的子串的情况 */ res = new Optimum(start,end,theStr); } else { /** * 分别求解三种子问题的最优解 */ Optimum left = helper(theStr, solArr, start + 1, end); Optimum right = helper(theStr, solArr, start, end - 1); Optimum mid = helper(theStr, solArr, start + 1, end - 1); /** * 如果start位置和end位置的字符相等,那么需要对A.sutString(1,A.length-1)类型问题 * 的解进一步处理 */ if(theStr.charAt(start) == theStr.charAt(end)) { /** * 如果start和end是相邻的整数,如6和7,那么从上面的代码可以知道此时mid一定是null, * 但是此时的start位置和end位置的字符相等,那么mid解应该是一个长度为2的回文串。 * * 如果mid不是null,并且mid解的回文串的起止位置刚好和start和end相邻,那么说明该解 * 可以被进一步延长,吧start和end位置的字符也包括进去。 */ if(mid == null || (mid.start == start+1 && mid.end == end-1)) mid = new Optimum(start,end,theStr); } /** * 比较并获取最优解 */ Optimum finest = left; if (mid!=null && mid.len>finest.len) finest = mid; if (right!=null && right.len>finest.len) finest = right; res = finest; } } /** * 讲此子问题的最优解记录到数组中 */ solArr[start][end] = res; /** * 返回解 */ return res; }}class Optimum { /** * 此类代表原始字符串的一个子串的最长回文子串 * @param start 此回文串在原始字符串中的起始偏移量 * @param end 此回文串在原始字符串中的终止偏移量 * @param len 此回文串的长度 * @param str 此回文串本身 */ int start = 0; int end = 0; int len = -1; String str = ""; @Override public String toString() { return "Solution{" + "start=" + start + ", end=" + end + ", len=" + len + ", str='" + str + '\'' + '}'; } public Optimum() { } public Optimum(int start, int end, String oriStr) { this.start = start; this.end = end; this.len = end-start+1; this.str = oriStr.substring(start,end+1); }}
到此,关于"如何编写代码实现一个字符串的最长回文子串"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
回文
字符
问题
字符串
最长
位置
代码
结果
学习
原始
情况
方法
个子
参数
数组
更多
长度
进一
偏移
处理
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
本地服务器和服务器
手机软件开发经理
oracle数据库导用户
服务器主板故障率
物理和网络安全评估
数据库用户变更后
华为的网络安全设备
数据库常用操作
py与数据库连接
网络安全服务考试题
2020国家网络安全周时间
熟练掌握mysql的数据库
信息网络安全中pbr模型
免费网络安全知识教案下载
服务器性能指标参数
数据库采样周期ms
管理系统 数据库设计
软件开发难度排名
安徽医疗软件开发公司
鲲鹏系列服务器价格多少
oracle数据库导用户
sci数据库变动
浦东新区二手网络技术特点
用txt代替数据库
网络安全设备维保招标
网络安全防护具体措施
网络安全检查简要情况说明
内江网络技术联系方式
关于软件开发系统设计的英语作文
我们能为网络安全做些什么