Leetcode005--字符串中最大的回文子串


一、原题



  Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 



二、中文



给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串 



三、举例



如字符串ekwr abcdcba asjflasj的最大非重复子串是abcdcba



四、思路



根据回文的特性,一个大回文按比例缩小后的字符串也必定是回文,比如ABCCBA,那BCCB肯定也是回文。我们可以先把所有长度最短为1的子字符串计算出来,根据起始位置从左向右,这些必定是回文。然后计算所有长度为2的子字符串,再根据起始位置从左向右。到长度为3的时候,我们就可以利用上次的计算结果:如果中心对称的短字符串不是回文,那长字符串也不是,如果短字符串是回文,那就要看长字符串两头是否一样



五、程序



package LeetCode;

public class Leetcode005 {
	public static void main(String args[]){
		String str = "sdjfljsaaaddasfabcdcbaoqeiur";
		System.out.println(longestPalindrome(str));
	}
	
       
    public static String longestPalindrome(String s) {
    	int maxLength = 0;
    	int maxStart = 0;
    	int len = s.length();
    	
    	boolean[][] dp = new boolean[len][len];
    	
    	//i表示的是字符串的长度
    	for(int i = 0; i < len; i++){
    		
    		//j表示的是字符串的起始位置
    		for(int j = 0; j < len - i; j++){
    			//也就是字符串中只有一次字符的时候
    			if(i==0 || i = 1){
    				dp[j][j] = true;
    			}else if(s.charAt(j+i)==s.charAt(j)){
    				//如果左右两端相等,那只要中心对称子字符串是回文就是回文
    				dp[j][j + i] = dp[j + 1][j + i - 1];
    			}else{
                    //否则不是回文
                    dp[j][j+i] = false;
    			}
    			
                // 如果中心字符串是回文,也就是该字符串是回文的,就将该最大的长度加1
                if(dp[j][j+i] && i > maxLength){
                    maxLength = i + 1;
                    maxStart = j;
                }
    		}
    	}
    	return s.substring(maxStart,maxStart + maxLength);
    }
}


------------------------output-----------------------------


abcdcba



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值