LeetCode 5. Longest Palindromic Substring

一、试题

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Input: “babad”

Output: “bab”

Note: “aba” is also a valid answer.
Example:

Input: “cbbd”

Output: “bb”

二、代码

传统方法,逐渐遍历查找。

class Solution {
public:
    string longestPalindrome(string s) {
	pair<int,int> pos;
	int max=0;
	for(int i=0; i<s.size(); i++){
		int st=i,en=i;
		while(s[st]==s[en] && st>=0 && en<s.size()){
			st--,en++;
		}
		if(en-st-1>max){
			max = en-st-1;
			pos = make_pair(st+1,en);
		}
		if(i+1<s.size() && s[i]==s[i+1]){
			int st=i,en=i+1;
			while(s[st]==s[en] && st>=0 && en<s.size()){
				st--,en++;
			}
			if(en-st-1>max){
				max = en-st-1;
				pos = make_pair(st+1,en);
			}			
		}
	}
	cout<<pos.first<<pos.second;

	return s.substr(pos.first,pos.second-pos.first);  
    }
};
// 对字符串每个位置展开查找
class Solution {
    public String longestPalindrome(String s) {
        if(s==null || s.length()==0) return "";
        int start = 0, end = 0;
        for(int i=0; i<s.length(); i++){
            int len1 = expandAroundCenter(s, i, i);
            int len2 = expandAroundCenter(s, i, i+1);
            int len = Math.max(len1, len2);
            if(len>end-start){
                start = i - (len-1)/2;
                end = i + len/2;
            }
        }
        return s.substring(start,end+1);
    }
    private int expandAroundCenter(String s, int left, int right){
        while( left>=0 && right<s.length() && s.charAt(left)==s.charAt(right) ){
            left--;
            right++;
        }
        return right-left-1;
    }
}
dp查找
class Solution {
    public String longestPalindrome(String s) {
        if(s == null || s.length() == 0) return "";
        int len = s.length();
        int start = 0;
        int end = 0;
        boolean[][] dp = new boolean[len][len];
        
        for(int i = 0; i < len; i++){
            dp[i][i] = true;
            if(i < len - 1 && s.charAt(i) == s.charAt(i+1)){
                dp[i][i+1] = true;
                if(end - start < 1){
                    start = i;
                    end = i + 1;
                }
            }
        }
        
        
        for(int i = 2; i < len; i++){
            for(int j = 0; j < len - i; j++){
                dp[j][i+j] = (s.charAt(j) == s.charAt(i+j) && dp[j+1][i+j-1]);
                if(dp[j][i+j] && end - start < i){
                    start = j;
                    end = i + j;
                }
            }
        }
        
        
        return s.substring(start, end+1);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值