LeetCode: Longest Palindromic Substring

Title : 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, and there exists one unique longest palindromic substring.

思路 1:扩展

每个字母单独都是一个长度为1的回文串,因此对每个字母我们可以向外扩展,不过需要考虑"abba","abcba"的情况,就是长度为奇数还是偶数。时间复杂度就是O(n2)

string getSubstring(string s,int i,int j){
		while (i >= 0 && j < s.size() && s[i] == s[j]){
			i--;
			j++;
		}
		return s.substr(i+1,j-i-1);
	}
	
	string longestPalindrome(string s){
		if (s.size() == 0)
			return "";
		string ret;
		int max = 0;
		for (int i = 0 ; i < s.size(); i++){
			string result = getSubstring(s,i,i);
			if (result.size() > max){
				max = result.size();
				ret = result;
			}
			result = getSubstring(s,i,i+1);
			if (result.size() > max){
				max = result.size();
				ret = result;
			}
		}
		return ret;
	}

思路二:使用动态规划。A[i,j]表示i和j是否相等。与其它的动态规划不同的是,这边,我们以长度进行扩展。分别以长度为2,3,...扩大判断

string longestPalindrome(string s){
        int n = s.length();
        int maxLength = 1;
        int left = 0;
        bool ** table = new bool*[n];
        for (int i = 0 ; i < n; i++){
            table[i] = new bool[n];
        }
        for (int i = 0 ; i < n; i++){
            for (int j = 0; j < n; j++){
                if (i == j)
                    table[i][j] = true;
                else
                    table[i][j] = false;
            }
        }
        for (int len = 2; len <= n; len++){
            for (int i = 0 ; i < n; i++){
                int j = i+len-1;
                if (j >= n)
                    break;
                if (s[i] != s[j]){
                    continue;
                }else{
                    if (i+1 > j-1)
                        table[i][j] = true;
                    else{
                        table[i][j] = table[i+1][j-1];
                    }
                }
                if (table[i][j] && (len > maxLength)){
                    maxLength = len;
                    left = i;
                    cout<<i<<" "<<j<<" "<<maxLength<<" "<<s.substr(left,maxLength)<<endl;
                }
            }
        }
        
        return s.substr(left,maxLength);

    }

思路3:将字符串反转,得到两个字符串,通过求解最长公共字串

string longestPalindrome(string s){
        string s1 = s;
        reverse(s.begin(),s.end());
        return LCS(s1,s);
    }
    string LCS(string s1,string s2){
        int n = s1.size();
        int m = s2.size();
        int maxLength = 0;
        int left = 0;
        int** table = new int* [n+1];
        for (int i = 0 ; i <= n; i++){
            table[i] = new int[m+1];
        }
        for (int i = 0 ; i <= n; i++)
            table[i][0] = 0;
        for (int j = 0 ; j <= m; j++)
            table[0][j] = 0;
        for (int i = 0 ; i < n; i++){
            for (int j = 0 ; j < m; j++){
                if (s1[i] == s2[j]){
                    table[i+1][j+1] = table[i][j]+1;
                }else{
                    table[i+1][j+1] = 0;
                }
                if (maxLength < table[i+1][j+1]){
                    maxLength = table[i+1][j+1];
                    left = i;
                }
            }
        }
        return s1.substr(left-maxLength+1,maxLength);
    }
原文地址:https://www.cnblogs.com/yxzfscg/p/4417042.html