1. 程式人生 > >Longest Palindromic String

Longest Palindromic String

來源:Leetcode Problem Set - Algorithm Problem5

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

解題思路:使用動態規劃的思想,建立一個n^2規模的布林陣列dp,dp[i][j]表示從i到j的連通性,在題中是從i到j的字串是否是迴文串,根據迴文的定義,若s[i] != s[j]則dp[i][j]一定為假,否則dp[i][j]的真假取決於dp[i+1][j-1]

程式碼解答:

class Solution {
public:
    string longestPalindrome(string s) {
        int size = 1000;
    	bool dp[size][size];
    	if (s.length() == 0) {
    		return "";
    	}
    	if (s.length() == 1) {
    		return s;
    	}
    	int i,j;
    	for (i = 0; i < s.length(); i++) {
    		for (j = 0; j < s.length(); j++) {
    			if (i >= j) dp[i][j] = true; // i=j代表只有一個字元的串,可以設定為迴文,當i>j是空串,可設定為迴文,其他情況都設定為不是迴文
    			else dp[i][j] = false;
    		}
    	}
    	int k;
    	int maxLen = 1;
    	int rf = 0, rt = 0;
    	for (k = 1; k < s.length(); k++) {
    		for (i = 0; k+i < s.length(); i++) {
    			j = i + k;
    			if (s[i] != s[j]) dp[i][j] = false;
    			else {
    				dp[i][j] = dp[i+1][j-1];
    				if (dp[i][j]) {
    					if (k+1 > maxLen) {
    						maxLen = k + 1;
    						rf = i;
    						rt = j;
    					}
    				}
    			}
    		}
    	}
    	return s.substr(rf, rt - rf + 1);
    }
};