1 问题描述

给定一个字符串,求它的最长回文子串的长度。

2 解决方案

2.1 中心扩展法


此处,首先枚举出回文串的中心位置,然后,再在该位置上分别向左和向右扩展,记录并更新得到的最长回文串的长度。

package com.liuzhen.string_1;

import java.util.Scanner;

public class StringLongestPalindrome {
/*
* 参数A:给定字符串
* 函数功能:返回字符串A中最长回文串的长度
*/
public int getLongestPalindrome(String A){
char[] arrayA = A.toCharArray();
int max = 0;
int tempMax = 0;
if(A.equals("") || A.equals(null))
return 0;
for(int i = 0;i < arrayA.length;i++){ //i为回文串的中心位置
//当回文串位数为奇数时
for(int j = 0;(i-j) >= 0 && (i+j) < arrayA.length;j++){
if(arrayA[i-j] != arrayA[i+j])
break;
tempMax = 2*j + 1;
}
if(tempMax > max)
max = tempMax;
//当回文串位数为偶数时
for(int j = 0;(i-j) >= 0 && (i+j+1) < arrayA.length;j++){
if(arrayA[i-j] != arrayA[i+j+1])
break;
tempMax = 2*j + 2;
}
if(tempMax > max)
max = tempMax;
}
return max;
} public static void main(String[] args){
StringLongestPalindrome test = new StringLongestPalindrome();
Scanner in = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String A = in.nextLine();
int maxA = test.getLongestPalindrome(A);
System.out.println("输入目标字符串中最长回文串的长度为:"+maxA);
}
}

运行结果:

请输入一个字符串:
abba
输入目标字符串中最长回文串的长度为:4 请输入一个字符串:
aabbbbba
输入目标字符串中最长回文串的长度为:7 请输入一个字符串:
我爱爱我我我啊
输入目标字符串中最长回文串的长度为:4

2.2 Manacher算法

package com.liuzhen.practice;

import java.util.Scanner;

public class Main {

    public void Manacher(String A) {
StringBuffer s = new StringBuffer("$#");
for(int i = 0;i < A.length();i++) {
s.append(A.charAt(i));
s.append("#");
}
A = s.toString();
int[] P = new int[A.length()];
int mx = 0, id = 0;
for(int i = 1;i < A.length();i++) {
if(mx > i)
P[i] = Math.min(P[2 * id - i], mx - i);
else
P[i] = 1;
while(i + P[i] < A.length() && i - P[i] >= 0 && A.charAt(i + P[i]) == A.charAt(i - P[i])) {
P[i]++;
}
if(P[i] + i > mx) {
mx = i + P[i];
id = i;
}
}
int result = -1;
int i = 0, t = 0;
for(;i < P.length;i++) {
if(P[i] > result) {
result = P[i];
t = i;
}
}
for(int j = t - result + 1;j <= t + result - 1;j++) {
if(A.charAt(j) != '#')
System.out.print(A.charAt(j));
}
System.out.println("\n最长字符串长度:"+(result-1));
} public static void main(String[] args) {
Main test = new Main();
Scanner in = new Scanner(System.in);
String A = in.next();
test.Manacher(A);
}
}

运行结果:

abba
abba
最长字符串长度:4
12321
最长字符串长度:5 我爱你爱我
我爱你爱我
最长字符串长度:5 我爱她

最长字符串长度:1

Java实现最长回文串的更多相关文章

  1. 算法笔记_032:最长回文串(Java)

    目录 1 问题描述 2 解决方案 2.1 中心扩展法 2.2 Manacher算法   1 问题描述 给定一个字符串,求它的最长回文子串的长度. 2 解决方案 2.1 中心扩展法 此处,首先枚举出回文 ...

  2. Java实现 LeetCode 409 最长回文串

    409. 最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意 ...

  3. (最长回文串 模板) 最长回文 -- hdu -- 3068

    http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory ...

  4. Manacher(输出最长回文串及下标)

    http://acm.hdu.edu.cn/showproblem.php?pid=3294 Girls' research Time Limit: 3000/1000 MS (Java/Others ...

  5. Manacher算法 - 求最长回文串的利器

    求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复 ...

  6. ACM题目————最长回文串

    Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等   Input 输入有多组cas ...

  7. MANACHER---求最长回文串

    求最长回文串,如果是暴力的方法的话,会枚举每个字符为中心,然后向两边检测求出最长的回文串,时间复杂度在最坏的情况下就是0(n^2),为什么时间复杂度会这么高,因为对于每一个作为中心的字符的检测是独立的 ...

  8. 字符串的最长回文串:Manacher’s Algorithm

    题目链接:Longest Palindromic Substring 1. 问题描述 Given a string S, find the longest palindromic substring ...

  9. Manacher's Algorithm 马拉车算法(求最长回文串)

    作用:求一个字符串中的最长子串,同时还可以求所有子串的长度. 题目链接: https://vjudge.net/contest/254692#problem/B 最长回文串长度的代码: int Man ...

随机推荐

  1. [hdu5249]动态中位数

    题意:3种操作分别为入队,出队,查询当前队列的中位数.操作数为1e5数量级. 思路:先考虑离线算法,可以离散+线段树,可以划分树,考虑在线算法,则有treap名次树,SBtree(size balan ...

  2. 前端:参数传错了,spring-boot:那错误信息我给你显示的友好点儿

    之前两篇文章 Spring-boot自定义参数校验注解和如何在spring-boot中进行参数校验,我们介绍了,参数校验以及如何自定义参数校验注解,但是当传递参数出错时,只是把错误信息打印到了控制台, ...

  3. jbpm4.4 timer的使用

    今天学习了jbpm4 的timer使用,一直测试都不成功:配置如下: <?xml version="1.0" encoding="UTF-8"?> ...

  4. JSP+Servlet+JDBC+mysql实现的学生成绩管理系统

    项目简介 项目来源于:https://gitee.com/zzdoreen/SSMS 本系统基于JSP+Servlet+Mysql 一个基于JSP+Servlet+Jdbc的学生成绩管理系统.涉及技术 ...

  5. HTML标签和属性二

    五.文本标记 7.文本样式 <b></b>  <strong></strong> 加粗 <i></i>   <em> ...

  6. DRF视图组件

    DRF视图组件: CVB模式继承----五层 from django.views import View # Django的View from rest_framework.views import ...

  7. linux常用命令---centOS7的管理服务(针对yum安装的)

    centOS7的管理服务(针对yum安装的)

  8. select 后台获取text 并根据text 设置value选中项

    -------获取select 的text string orderNo = this.orderNo.Items[this.orderNo.SelectedIndex].Text; -----根据t ...

  9. mysql 赋权语句

    grant all privileges on phplampDB.* to phplamp@localhost identified by '1234';

  10. tp隐藏入口文件

    [ Apache ] httpd.conf配置文件中加载了mod_rewrite.so模块 AllowOverride None 将None改为 All 把下面的内容保存为.htaccess文件放到应 ...