LeetCode-5-Longest Palindromic Substring最長回文サブストリングDP

3738 ワード

C++:
中心点を列挙してタイムリーに枝を切るのが一番速いはずですが、私は書いていません.私は最も古典的な方法で解決しました.DPですが、3つの言語の時間効率の違いは本当に大きくて、LeetCodeのテストサンプルが分かりません.異なる言語に対してまだ違いますか.まさか、もう数量級が違います.
class Solution {
public:
    int dp[1009][1009];
    string longestPalindrome(string s) {
        int ansl=0,ansr=0,ans=1;
        int L=s.length();
        memset(dp,-1,sizeof(dp));
        for(int i=0;i=2){
                        if(dp[l+1][r-1]!=-1){
                            dp[l][r]=r-l+1;
                            if(dp[l][r]>ans){
                                ans=dp[l][r];
                                ansl=l;
                                ansr=r;
                            }
                        }
                    }
                    else{
                        if(dp[l+1][r]!=-1||dp[l][r-1]!=-1){
                            dp[l][r]=r-l+1;
                            if(dp[l][r]>ans){
                                ans=dp[l][r];
                                ansl=l;
                                ansr=r;
                            }
                        }
                    }
                }
            }
        }
        return s.substr(ansl,ansr-ansl+1);
    }
};

Java:
ほとんどCと同じコードで、結局TLEになってしまい、戸惑ってしまいました.
class Solution {
    public int dp[][]=new int[1009][1009]; 
    public String longestPalindrome(String s) {
        int ansl=0,ansr=0,ans=1;  
        int L=s.length();  
        for(int i=0;i=2){  
                        if(dp[l+1][r-1]!=-1){  
                            dp[l][r]=r-l+1;  
                            if(dp[l][r]>ans){  
                                ans=dp[l][r];  
                                ansl=l;  
                                ansr=r;  
                            }  
                        }  
                    }  
                    else{  
                        if(dp[l+1][r]!=-1||dp[l][r-1]!=-1){  
                            dp[l][r]=r-l+1;  
                            if(dp[l][r]>ans){  
                                ans=dp[l][r];  
                                ansl=l;  
                                ansr=r;  
                            }  
                        }  
                    }  
                }  
            }  
        }  
        return s.substring(ansl,ansr+1); 
    }
}

Python:
爆発するまで速度が遅く、Aになったが.同じアルゴリズム,c++143 ms,java TLE,Python 7562 ms
class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        ansl=0
        ansr=0
        ans=1  
        L=s.__len__() 
        dp=[[-1 for x in range(L)] for y in range(L)]
        for i in range(L):
            dp[i][i]=1
        for i in range(2,L+1):
            for j in range(L-i+1):
                l=j
                r=j+i-1
                if s[l]==s[r]:
                    if r-l>=2:
                        if dp[l+1][r-1]!=-1:
                            dp[l][r]=r-l+1
                            if dp[l][r]>ans:
                                ans=dp[l][r]  
                                ansl=l
                                ansr=r
                    else:
                        if dp[l+1][r]!=-1 or dp[l][r-1]!=-1:
                            dp[l][r]=r-l+1
                            if dp[l][r]>ans:
                                ans=dp[l][r]  
                                ansl=l  
                                ansr=r 

        return s[ansl:ansr+1]