LeetCode-5-Longest Palindromic Substring最長回文サブストリングDP
3738 ワード
C++:
中心点を列挙してタイムリーに枝を切るのが一番速いはずですが、私は書いていません.私は最も古典的な方法で解決しました.DPですが、3つの言語の時間効率の違いは本当に大きくて、LeetCodeのテストサンプルが分かりません.異なる言語に対してまだ違いますか.まさか、もう数量級が違います.
Java:
ほとんどCと同じコードで、結局TLEになってしまい、戸惑ってしまいました.
Python:
爆発するまで速度が遅く、Aになったが.同じアルゴリズム,c++143 ms,java TLE,Python 7562 ms
中心点を列挙してタイムリーに枝を切るのが一番速いはずですが、私は書いていません.私は最も古典的な方法で解決しました.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]