题目描述

对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。

给定字符串A以及它的长度n,请返回最长回文子串的长度。

测试样例:

"abc1234321ab",12
返回:7

CODE

  • 暴力求解一:

    2682ms 5752KB
# -*- coding:utf-8 -*-class Palindrome:def getLongestPalindrome(self, A, n):# write code hereif n <= 1:return ns = int(n /2)max_n = 0arr = list(A)for i in range(n-1):i += 1step = min(s, n - i)for j in range(step):j+=1c = arr[i]tr = arr[i+1 : i+j+1]tl = arr[i+1 : i+j+1]tl.reverse()c1 = []c2 = []c1.extend(tl)c1.extend(c)c1.extend(tr)c2.extend(tl)c2.extend(c)c2.extend(c)c2.extend(tr)if ("".join(c1) in A):max_n = max(max_n, len(c1))elif ("".join(c2) in A):max_n = max(max_n, len(c2))return max_n
  • 暴力求解二:

    211ms 32072KB
 public int getLongestPalindrome(String s) {if(s == null){return 0;}if(s.length() <= 1)return s.length();String res=s.substring(0,1);for (int i = 0; i < s.length(); i++) {for (int j = i + 1; j <= s.length(); j++) {String k=s.substring(i,j);String rk=new StringBuffer(k).reverse().toString();if(k.equals(rk)&&k.length()>res.length()){res=k;}}}return res.length();}
  • 暴力求解三:

    115ms 29352KB
public int getLongestPalindrome(String s) {if (s == null)return 0;if(s.length() <= 1)return s.length();for(int i = s.length();i > 0; i--) {//子串长度for (int j = 0; j <= s.length() - i; j++) {String sub = s.substring(j , i + j);//子串位置int count = 0;//计数,用来判断是否对称for (int k = 0; k < sub.length() / 2; k++) {//左右对称判断if (sub.charAt(k) == sub.charAt(sub.length() - k - 1))count++;}if (count == sub.length() / 2)return sub.length();}}return 1;}
  • 动态规划:

    38ms 11376KB
    public int getLongestPalindrome(String s) {if (s == null) {return 0;}if (s.length() <= 1) {return s.length();}int n = s.length();boolean[][] dp = new boolean[n][n];int left = 0;int right = 0;for (int i = n - 2; i >= 0; i--) {dp[i][i] = true;for (int j = i + 1; j < n; j++) {dp[i][j] = s.charAt(i) == s.charAt(j) &&( j-i<3||dp[i+1][j-1]);//小于3一定是回文if(dp[i][j]&&right-left<j-i){left=i;right=j;}}}return right - left + 1;}
  • Manacher算法(原文:https://blog.csdn.net/qq_32354501/article/details/80084325)

    31ms 9832KB
public int getLongestPalindrome(String s) {if (s == null) {return 0;}if (s.length() <= 1) {        return s.length();}List<Character> s_new = new ArrayList<>();for(int i = 0;i < s.length();i++){s_new.add('#');s_new.add(s.charAt(i));}s_new.add('#');List<Integer> Len = new ArrayList<>();String sub = "";//最长回文子串int sub_midd = 0;//表示在i之前所得到的Len数组中的最大值所在位置int sub_side = 0;//表示以sub_midd为中心的最长回文子串的最右端在S_new中的位置Len.add(1);for(int i = 1;i < s_new.size();i++){if(i < sub_side) {//i < sub_side时,在Len[j]和sub_side - i中取最小值,省去了j的判断int j = 2 * sub_midd - i;if(j >= 2 * sub_midd - sub_side &&  Len.get(j) <= sub_side - i){Len.add(Len.get(j));}elseLen.add(sub_side - i + 1);}else//i >= sub_side时,从头开始匹配Len.add(1);while( (i - Len.get(i) >= 0 && i + Len.get(i) < s_new.size()) && (s_new.get(i - Len.get(i)) == s_new.get(i + Len.get(i))))Len.set(i,Len.get(i) + 1);//s_new[i]两端开始扩展匹配,直到匹配失败时停止if(Len.get(i) >= Len.get(sub_midd)){//匹配的新回文子串长度大于原有的长度sub_side = Len.get(i) + i - 1;sub_midd = i;}}sub = s.substring((2*sub_midd - sub_side)/2,sub_side /2);//在s中找到最长回文子串的位置return sub.length();}

思想

参考文章:https://blog.csdn.net/SeaSky_Steven/article/details/108603928

计算给定字符串中最长回文子串的长度(或查找最长回文子串)相关推荐

  1. 字符串的回文子序列个数_计算给定字符串中回文子序列的数量

    字符串的回文子序列个数 Problem statement: 问题陈述: Given a string you have to count the total number of palindromi ...

  2. java出现次数最多的字母_java计算给定字符串中出现次数最多的字母和该字

    importJava.util.Collections; importjava.util.Map; importjava.util.TreeMap; publicclassTestStringSpli ...

  3. Java黑皮书课后题第7章:*7.22(计算一个字符串中大写字母的数目)编写程序,从命令行输入一个字符串,然后显示字符串中大写字母的数目

    7.22(计算一个字符串中大写字母的数目)编写程序,从命令行输入一个字符串,然后显示字符串中大写字母的数目 题目 题目描述 破题 代码 运行实例 题目 题目描述 7.22(计算一个字符串中大写字母的数 ...

  4. Java黑皮书课后题第6章:*6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数。编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数

    6.20(计算一个字符串中字母的个数)编写一个方法,使用下面的方法体计算字符串中的字母个数.编写一个测试程序,提示用户输入字符串,然后显示字符串中的字母个数 题目 题目描述 破题 代码 运行示例 题目 ...

  5. 每天一道LeetCode-----寻找给定字符串中重复出现的子串

    Repeated DNA Sequences 原题链接Repeated DNA Sequences 在给定字符串中寻找重复出现的序列,每个序列长度为10 可以采用unordered_map记录每个序列 ...

  6. 7-65 字符串替换 (15 分) 本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换: 原字母 对应字母 A Z B Y C X D W … … X C Y B Z A

    7-65 字符串替换 (15 分) 本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换: 输入格式: 输入在一行中给出一个不超过80个字符.并以回车结束的字符串. 输出格式: 输出在一行 ...

  7. 统计给定字符串中各字符的个数

    题目要求:统计一个给定字符串中指定的字符出现的次数具体的输入输出格式规定如下: 输入格式:测试输入包含若干测试用例,每个测试用例包含2行,第1行为一个长度不超过 5的字符串,第2行为一个长度不超过80 ...

  8. python 计算一个字符串中所有数字的和

    # 计算一个字符串中所有数字的和def numsum(s):sum = 0 #定义变量,准备记录数字的和for i in range(len(s)): #遍历字符串if s[i] >= '0' ...

  9. 本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:

    本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换: 原字母 对应字母 A Z B Y C X D W - - X C Y B Z A 输入格式: 输入在一行中给出一个不超过80个字符. ...

最新文章

  1. linux源码安装浏览器,Linux系统手动安装Firefox浏览器
  2. 机房冒水导致1500万元研发的源代码消失,软件公司起诉物业索赔七百万
  3. node.js跨域问题
  4. ubuntu默认root密码
  5. 东大18春计算机基础在线作业,东大18春学期《计算机基础》在线作业123满分答案...
  6. 图论 —— 2-SAT 问题
  7. Open vSwitch流表应用实战
  8. Swagger使用总结
  9. 工具 cocoapods和插件
  10. 基于vue的手机阅读小说类webapp
  11. 刘汝佳Dijkstra模板
  12. ORB-SLAM3论文翻译
  13. 电脑无法读取外接硬盘修复
  14. 2021年湖南省高考体考成绩查询,2021年湖南体育专业考试成绩查询网址:http://jyt.hunan.gov.cn/...
  15. 【elastic-job】elastic-job部署以及简单例子
  16. linux pcm和alsa 区别,linux alsa pcm(此pcm非硬件pcm接口)
  17. CSS基础:text-overflow:ellipsis溢出文本显示省略号的详细方法_CSS教程
  18. 前端开发的基础生产力素养(后期不定期更新)
  19. js调用摄像头并截图
  20. tensorflow 报错 IndexError: pop from empty list

热门文章

  1. 什么样的企业需要舆情优化系统?什么样的企业需要手工监测?
  2. linux设置打开终端快捷键
  3. 矮轴机械键盘用起来会更爽吗?Keychron K1告诉你答案
  4. LINUX IIO子系统分析之六 iio device的驱动开发流程说明
  5. Ubuntu使用自带的Liboffice Draw去除PDF水印
  6. 神经网络——Conv2d的使用
  7. 适用于 Windows 和 macOS 的几款免费视频转换软件
  8. 关于DDK中的编译知识
  9. 数据科学导论——数据预处理进阶
  10. Hadoop、Hive、HDFS、Hbase、KUDU、Spark之间关系