Java实现最长回文串
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实现最长回文串的更多相关文章
- 算法笔记_032:最长回文串(Java)
目录 1 问题描述 2 解决方案 2.1 中心扩展法 2.2 Manacher算法 1 问题描述 给定一个字符串,求它的最长回文子串的长度. 2 解决方案 2.1 中心扩展法 此处,首先枚举出回文 ...
- Java实现 LeetCode 409 最长回文串
409. 最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意 ...
- (最长回文串 模板) 最长回文 -- hdu -- 3068
http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Time Limit: 4000/2000 MS (Java/Others) Memory ...
- Manacher(输出最长回文串及下标)
http://acm.hdu.edu.cn/showproblem.php?pid=3294 Girls' research Time Limit: 3000/1000 MS (Java/Others ...
- Manacher算法 - 求最长回文串的利器
求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复 ...
- ACM题目————最长回文串
Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等 Input 输入有多组cas ...
- MANACHER---求最长回文串
求最长回文串,如果是暴力的方法的话,会枚举每个字符为中心,然后向两边检测求出最长的回文串,时间复杂度在最坏的情况下就是0(n^2),为什么时间复杂度会这么高,因为对于每一个作为中心的字符的检测是独立的 ...
- 字符串的最长回文串:Manacher’s Algorithm
题目链接:Longest Palindromic Substring 1. 问题描述 Given a string S, find the longest palindromic substring ...
- Manacher's Algorithm 马拉车算法(求最长回文串)
作用:求一个字符串中的最长子串,同时还可以求所有子串的长度. 题目链接: https://vjudge.net/contest/254692#problem/B 最长回文串长度的代码: int Man ...
随机推荐
- HDU 3874 Necklace 区间查询的离线操作
题目: http://acm.hdu.edu.cn/showproblem.php?pid=3874 对需要查询的区间按右端点排序,然后从左到右依次加入序列中的元素,同时更新,更新的方法是,把上一次出 ...
- jsp 中文乱码????解决
中文乱码是个非常蛋疼的问题,在页面表单提交的时候后台获取数据变成了????,解决方案如下: 1:确认编码都是一致的如页面和后台都设置为utf-8 2:String str = new String(r ...
- SunOS下root账户无法执行crontab问题
SunOS下root账户无法执行crontab问题 直接步入正题,处理方法如下: 1.查看可执行crontab的用户: more /etc/cron.d/cron.deny 2.修改crontab ...
- Python-MD5加密算法接口测试
前言 在之前的Python系列的随笔中,我跟小伙伴们讲述了Python-AES加密算法接口测试和Python-SHA256加密算法接口测试,今天我们来学习一下登录密码是md5加密的情况下,该如何使用p ...
- JVM系列(2)-GC
1.什么是GC? 大白话说就是垃圾回收机制,内存空间是有限的,你创建的每个对象和变量都会占据内存,gc做的就是对象清除将内存释放出来,这就是GC要做的事. 2.需要GC的区域 说起垃圾回收的场所,了解 ...
- Vue Element-UI使用第三方icon图标(转)
转载自:https://www.jianshu.com/p/59dd28f0b9c9 1.打开阿里icon,注册 >登录>图标管理>我的项目 2.新建项目 3. 添加icon到项 ...
- DRF视图组件
DRF视图组件: CVB模式继承----五层 from django.views import View # Django的View from rest_framework.views import ...
- 如何安放你的大文件,MongoDB GridFS可以帮助你
1 简介 众所周知(你不知也当你知),MongoDB是以文档(Document)组织数据的.除了常用于存储Json数据,它也是可以存储普通文件的.我们可以把一些文件以BSOON的格式存入MongoDB ...
- InnoDB存储引擎的高级特性大盘点
InnoDB作为mysql数据库最常用的存储引擎,自然包含了其独有的很多特性.如相比于memory.MyISAM引擎,InnoDB支持行级锁.事务等都是比较重要的特性. 本文将盘点下InnoDB处理事 ...
- SQL——MySQL数据类型
Text类型: Number类型: Date类型: