【发布时间】:2018-11-24 14:29:58
【问题描述】:
¡你好!
在使用动态编程之后,我正在尝试以良好的时间和空间复杂度找到两个字符串之间的最长公共子字符串。我可以找到具有 O(n^2) 时间和空间复杂度的解决方案:
public static String LCS(String s1, String s2){
int maxlen = 0; // stores the max length of LCS
int m = s1.length();
int n = s2.length();
int endingIndex = m; // stores the ending index of LCS in X
// lookup[i][j] stores the length of LCS of substring
// X[0..i-1], Y[0..j-1]
int[][] lookup = new int[m + 1][n + 1];
// fill the lookup table in bottom-up manner
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
// if current character of X and Y matches
if (s1.charAt(i - 1) == s2.charAt(j - 1))
{
lookup[i][j] = lookup[i - 1][j - 1] + 1;
// update the maximum length and ending index
if (lookup[i][j] > maxlen)
{
maxlen = lookup[i][j];
endingIndex = i;
}
}
}
}
// return Longest common substring having length maxlen
return s1.substring(endingIndex - maxlen, endingIndex);
}
我的问题是:如何获得更好的空间复杂度?
提前致谢!
【问题讨论】:
-
你怎么知道有可能得到 O(n) 时间?你的来源是什么?回答这个问题,你就已经回答了一半了。
-
不,不是。我在问常见的子串空间复杂度,而这个问题是在问常见的子序列时间复杂度
标签: java dynamic-programming space-complexity