字符串的最长回文子串问题

来源:互联网 发布:java 轻量级orm框架 编辑:程序博客网 时间:2024/05/16 06:42

解题的具体思路都有相应注释,所以直接上代码

public class Palindrome {public static void main(String[] args) {Palindrome p = new Palindrome();System.out.println(p.getMost("")); //0System.out.println(p.getMost("1")); //1System.out.println(p.getMost("jdlakjlkljkadlkj"));//9}public int getMost(String str){if(str==null||str.length()==0){return 0;}int max=0,curL=0;/** * str的回文子串的长度可能为奇数,也有可能为偶数, * 在代码处理时比较麻烦 * 因此通过往每个字符的左右两边各插入一个'#'的方式, *  * ==>得到chs, 则chs的回文子串必为奇数 *  * 读者朋友可以在纸上画一画,验证上述结论是否成立 */char []chs = new char[str.length()*2+1];int index=0;for(;index<str.length();index++){chs[2*index] = '#';chs[2*index+1] = str.charAt(index);}chs[2*index]='#';/** * 接下来采用中心扩展法, * 假设最长回文子串的中心是c=1-->c=chs.length-1的某一个位置, *  * 遍历这些位置,并记录相应的最大长度 */for(int c=1;c<chs.length-1;c++){/** * 假设中心为c * 则以c为中心,以g为半径,向左右两侧发散 *  * 左侧临界点为c-g>=0,右侧临界点为c+g<=chs.length-1 */for(int g=0;(c-g>=0)&&(c+g<=chs.length-1);g++){if(chs[c-g]==chs[c+g]){curL = 2*g+1;if(curL>max){max = curL;}}else{break;}}}/** * 因为在长度为max的回文子串, * '#'的个数肯定比实际字符串多1,(max必为奇数) * 所以返回值=max/2 */return max/2;}}




0 0
原创粉丝点击