package string.string1_6;

public class LongestPalidrome
{
/**
* 使用常规方法, 以字符串的每一个字符作为中心进行判断, 包括奇数和偶数的情况
* 最坏时间复杂度为O(N^2) , 空间复杂度O(1)
*/
public static int longestPalidrome(String s)
{
if(s == null || s.length() <= 0)
return 0 ; int max = 0 ; for(int i=0 ; i<s.length() ; i++)
{
for(int time=0 ; time<2 ; time++)
{
int length = getMax(s , i , time+i) ;
if(max < length)
max = length ;
}
} return max ;
} private static int getMax(String s, int left , int right) {
while (left >= 0 && right <= s.length() - 1) {
if (s.charAt(left) != s.charAt(right))
break;
left--;
right++;
} return right - left - 1;
} /**
* 使用manacher算法(其实就是动态规划的一种情况)
* 时间复杂度O(N), 空间复杂度O(N)
*/
public static int longestPalidrome2(String s)
{
if(s == null || s.length() < 1)
return 0 ;
String judge = init(s) ; int id = 0 ; //最大回文的中心
int mx = 0 ; //为id+p[id], 也就是最大回文的后半段
int[] p = new int[judge.length()] ; for(int i=1 ; i<judge.length()-1 ; i++)
{
if(i < mx)
{
p[i] = min(p[2*id-i] , mx-i) ; //对p[i]进行预测
}
else
{
p[i] = 1 ; //无法使用之前的结论进行预测, 因此只能先假设p[i]只为该元素本身的长度1.
} while (judge.charAt(i-p[i]) == judge.charAt(i+p[i])) //在mx外是否仍存在回文
p[i]++ ; //更新mx和id
if(p[i]+i-1 > mx)
{
mx = p[i] + i -1;
id = i ;
}
} int mxId = 0 ;
for(int i=1 ; i<p.length ; i++)
{
if(p[i] > p[mxId])
mxId = i ;
} return p[mxId]-1 ;
} /**
* 预处理:将原来的字符串str填充为为$#...#*的格式
* 由于java没有\0作为字符串的结束标志, 因此在结尾使用*作为结束标志
* 其中的$和*是用来当哨兵的
*/
private static String init(String str)
{
StringBuilder sb = new StringBuilder(str.length()*2+2) ; sb.append("$#") ;
for(int i=0 ; i<str.length() ; i++)
{
sb.append(str.charAt(i)).append("#") ;
} sb.append("*") ;
return sb.toString() ;
}
private static int min(int a , int b)
{
return a > b ? b : a ;
} public static void main(String[] args)
{
//dsjfkldsababasdlkfjsd
//skjflkdsjfkldsababasdlkfjsdwieowowwpw
String str = "a"; System.out.println(longestPalidrome2(str));
}
}

参考://https://yq.aliyun.com/articles/3739

java 最长回文字串的更多相关文章

  1. 求字符串的最长回文字串 O(n)

    昨天参加了某公司的校园招聘的笔试题,做得惨不忍睹,其中就有这么一道算法设计题:求一个字符串的最长回文字串.我在ACM校队选拔赛上遇到过这道题,当时用的后缀数组AC的,但是模板忘了没写出代码来. 回头我 ...

  2. hihocoder 第一周 最长回文字串

    题目1 : 最长回文子串 时间限制:1000ms 单点时限:1000ms 内存限制:64MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程 ...

  3. POJ 3974 最长回文字串(manacher算法)

    题意:给出一个字符串,求出最长回文字串. 思路:一开始我直接上了后缀数组DC3的解法,然后MLE了.看了DISCUSS发现还有一种计算回文字串更加优越的算法,就是manacher算法.就去学习了一下, ...

  4. 最长回文字串——manacher算法

    时间复杂度:O(n) 参考:https://segmentfault.com/a/1190000003914228 1.问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度. 如果一个字 ...

  5. Hdu 3068 最长回文字串Manacher算法

    题目链接 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. 最长回文字串 (The longest palindrome substring)

    这两天去学了一下,觉得下面那篇文章写的很好,有例子,比较容易懂,所以转一下. 以下内容来自:hihoCoder: 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互 ...

  7. Leetcode5.Longest Palindromic Substring最长回文字串

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...

  8. 【POJ3974】最长回文字串

    在这里采用的是哈希+二分的方法. 根据回文串的性质可知,可以将回文分成奇回文和偶回文分别进行处理. 对于奇回文来说,每次枚举的端点一定是重合的,因此只需计算出端点左右公共的长度是多少即可,因此二分的是 ...

  9. 【LeetCode每天一题】Longest Palindromic Substring(最长回文字串)

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

随机推荐

  1. 仔细瞄一下HashMap是怎么干活的

    以下分析基于jdk11.0.2 1. 创建HashMap时发生了什么? HashMap(),HashMap(int initialCapacity),HashMap(int initialCapaci ...

  2. Keepalived+NFS+SHELL脚本实现NFS-HA高可用

    本来想做DRBD+HEARTBEAT,但是领导说再加硬盘浪费资源,没有必要,而且在已有硬盘上做风险较大,所以就只能用rsync来实现数据同步了,实验中发现很多的坑,都用脚本和计划任务给填上了,打算把这 ...

  3. 【CF652C】Foe Pairs(线性扫描)

    题意:给你1-n的一个排列和m组数对,问有多少区间不包含任意一个数对. (1 ≤ n, m ≤ 3·105) 思路:数据范围过大,不能用容斥原理 f[i]表示以位置i上的数为左端点,右端点最小到哪里 ...

  4. YUV和RGB格式分析【转】

    转自:http://www.cnblogs.com/silence-hust/p/4465354.html 做嵌入式项目的时候,涉及到YUV视频格式到RGB图像的转换,虽然之前有接触到RGB到都是基于 ...

  5. cin和scanf的速度差别

    好长时间没有遇到这种问题了,以前虽然知道scanf比cin快,但是没想到快这么多,见图. 50万的数据. scanf输入: cin输入: 网上说用std::ios::sync_with_stdio(f ...

  6. ES6 的Object.assign(target, source_1, ···)方法与对象的扩展运算符

    一.基本概念 Object.assign方法用来将源对象(source)的所有可枚举属性,复制到目标对象(target).它至少需要两个对象作为参数,第一个参数是目标对象,后面的参数都是源对象. Ob ...

  7. redis 延迟消息

    1.查询下redis 是否打开了键空间通知功能 发现打开了,如果没有打开可以在执行下 我们可以看到参数设置 2.订阅下键空间或者事件通知 订阅键空间:subscribe __keyspace@0__: ...

  8. ANT---调用外部命令的一些坑

    最近用到了Ant,发现还是有许多功能是Ant没有提供相应Task支持,而操作系统提供了相应的系统命令.Ant说明书上说了,用<exec>可以调用系统命令,实际操作起来才发现陷阱可不少,一不 ...

  9. GitHub+Octopress搭建免费blog

    生成github公钥 检查ssh公钥设置: 如果id_rsa*文件不存在,跳到第三步: $ cd .ssh $ ls 备份原来的ssh key: 备份旧数据,备份后删除旧数据: $ mkdir key ...

  10. iOS -- 设置label的自适应

    - (void)AutoLabel { //准备工作 self.font = [UIFont systemFontOfSize:]; self.textColor = [UIColor whiteCo ...