Java - PAT - L2-008. 最长对称子串 Manacher算法
2016-05-28 19:53
453 查看
L2-008. 最长对称子串
时间限制100 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定"Is PAT&TAP symmetric?",最长对称子串为"s PAT&TAP s",于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); String s = sc.nextLine(); System.out.println(getPalindromeLength(s)); } public static int getPalindromeLength(String str){ StringBuilder newStr = new StringBuilder(); //获取新的字符串 newStr.append("#"); for(int i=0 ;i<str.length() ;i++){ newStr.append(str.charAt(i)); newStr.append("#"); } int[]rad = new int[newStr.length()]; int right = -1; //右边界 int id = -1; //中心坐标 for(int i=0 ;i<newStr.length() ;i++){ int r =1 ; //确定一个最小半径 if(i<=right){ r = Math.min(rad[id]-i+id, rad[2*id-i]); } //寻找更大半径 //三个条件 1:中心-半径>=0 2:中心+半径<字符串长度(中心+半径<=length-1) 3:字符串关于中心对称点相同 //符合条件的话,半径自加 while(i-r>=0&&i+r<newStr.length()&&newStr.charAt(i-r)==newStr.charAt(i+r)){ r++; } //更新边界 和 中心坐标 if(i+r-1>right){ right = i+r-1; id = i; } rad[i] = r; } int maxLength = 0; for(int r:rad){ if(r>maxLength){ maxLength = r; } } return maxLength-1 ; } }
因为
相关文章推荐
- hdu 4085 Peach Blossom Spring(斯坦纳树)
- Myeclipse下java.lang.OutOfMemoryError: Java heap space的解决
- 深入学习java并发编程:ThreadLocal<T>实现
- 深入学习java集合:Hashtable<K,V>实现
- javax.persistence.Table.indexes()[Ljavax/persistence/Index;
- 深入学习java集合:LinkedHashMap<K,V>实现
- 深入学习java集合:HashMap<K,V>实现
- JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例
- JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例
- Struts2中的ModelDriven机制及其运用
- java设计模式-备忘录模式
- Spring切面编程步骤
- Java 指针和字符串简述
- Java密码加密与解密
- Eclipse常用开发插件
- java 异常练习题2
- IT十八掌掌第十二天课程总结
- java设计模式-观察者模式(广播机制,消息订阅)
- java join()方法
- Spring整合CXF之发布WebService服务