zoukankan      html  css  js  c++  java
  • [LeetCode]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.

    思考:遍历求每个字符的左右延伸的最长字符串。

    class Solution {
    public:
        string compare(string s,int left,int right)
        {
            while(left>=0&&right<s.size())
            {
                if(s[left]==s[right])
                {
                    left--;
                    right++;
                }
                else break;
            }
            return s.substr(left+1,right-left-1);
        }
        string longestPalindrome(string s) {
            int len=0;
            int maxlen=0;
            string ans,res;
            for(int i=0;i<s.size();i++)
            {
                ans=compare(s,i,i);
                if(ans.size()>res.size()) res=ans;
                ans=compare(s,i,i+1);
                if(ans.size()>res.size()) res=ans;
            }
            return res;
        }
    };
    

     网上有个更好的Manacher算法,只要O(n):

    http://leetcode.com/2011/11/longest-palindromic-substring-part-ii.html

    http://www.felix021.com/blog/read.php?2040

    class Solution {
    public:
    	string preProcess(string s) 
    	{  
    		int n = s.length();  
    		if (n == 0) 
    			return "^$";  
    		string ret = "^";  
    		for (int i = 0; i < n; i++)    
    			ret += "#" + s.substr(i, 1);   
    		ret += "#$";  return ret;
    	} 
    	string longestPalindrome(string s) {
    		// IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
    		string T = preProcess(s);  
    		int n = T.length();  
    		int *P = new int[n];  
    		int C = 0, R = 0;  
    		for (int i = 1; i < n-1; i++) 
    		{    
    			int i_mirror = 2*C-i; // equals to i' = C - (i-C)        
    			P[i] = (R > i) ? min(R-i, P[i_mirror]) : 0;        
    			// Attempt to expand palindrome centered at i    
    			while (T[i + 1 + P[i]] == T[i - 1 - P[i]])      
    				P[i]++;     
    			// If palindrome centered at i expand past R,    
    			// adjust center based on expanded palindrome.    
    			if (i + P[i] > R) 
    			{      
    				C = i;      
    				R = i + P[i];    
    			}  
    		}   
    		// Find the maximum element in P.  
    		int maxLen = 0;  
    		int centerIndex = 0;  
    		for (int i = 1; i < n-1; i++) 
    		{    
    			if (P[i] > maxLen) 
    			{      
    				maxLen = P[i];      
    				centerIndex = i;    
    			}  
    		}  
    		delete[] P;    
    		return s.substr((centerIndex - 1 - maxLen)/2, maxLen);
    	}
    };
    

      

  • 相关阅读:
    chapter4.6生成器
    chapter4.4、递归
    chapter4.3、函数执行流程
    chapter4.2、函数返回值
    直接插入排序
    打印三角型的练习
    杂记
    linux top命令
    makefile 中的 := , += ,?=
    makefile中的shell语法 || Makefile中的@
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3411066.html
Copyright © 2011-2022 走看看