【发布时间】:2020-04-13 00:35:32
【问题描述】:
class Solution {
public String longestPalindrome(String s) {
if(s.length() == 0){
return "";
}
String[][] dp = new String[s.length()][s.length()];
int n = s.length();
for(int i=0; i<n; i++){
dp[i][i] = s.substring(i,i+1);
}
int l = n/2;
int r = n/2;
while(!(l==0 && r==n-1)){
if(l>0){
l--;
}
if(r<n-1){
r++;
}
longest(l, r, s, dp);
}
return dp[0][n-1];
}
public String longest(int l, int r, String s, String[][] dp) {
if(dp[l][r] != null){
return dp[l][r];
} else if(s.charAt(l) == s.charAt(r) && (l == r-1 || longest(l+1, r-1, s, dp).length() == ((r-1) - (l+1))+1)){
dp[l][r] = s.substring(l,r+1);
return dp[l][r];
} else {
String l1 = longest(l, r-1, s, dp);
String l2 = longest(l+1, r, s, dp);
dp[l][r] = l1.length() > l2.length() ? l1 : l2;
return dp[l][r];
}
}
}
dp[i][j] 表示索引 i,j 之间的最大回文串。我们最终会返回 dp[0][s.length()-1]
代码分析:
如果字符串(比如 b)的长度为 1,我们可以从中得到的最大回文数将是字符串本身(b)。现在让我们将字符串扩展到后面的 +b+。如果将 + 符号替换为某些字母,最长的回文字符串将是什么。我们可以考虑两种可能性: i) 两个字母相同 ii)它们都是不同的。 如果 case i --> 我们可以说整个字符串是回文,因为我们知道字母之间的字符串完全是回文。 如果情况 ii --> 我们将有两种可能性考虑左而忽视右或考虑右而忽视左。我们正在寻找的那个是产生最大回文字符串的那个。
基于这个想法,我们将填充整个 dp 数组。
我知道算法的空间复杂度是 O(n^2),但运行时复杂度是多少。是 O(n^2) 还是 O(n^3)?
【问题讨论】:
-
我认为您的算法不起作用。但是你的方法是围绕中心展开,这需要 O(n^2) 时间复杂度
-
@Melchia 它确实有效,并进行了完美的验证。是的,它正在围绕中心扩展。
-
“完美验证”没有任何意义。你有证据吗?
标签: algorithm performance