【发布时间】:2015-06-25 04:48:07
【问题描述】:
我正在尝试使用自下而上的动态编程编写两个 String 对象的 LCS。我能够让它与O(mn) 空间一起正常工作。但是,正如我所见,我不需要前面的所有列。因此,我尝试对其进行修改以使其适合 2 列,因此空间变为O(m)。但是,它不适用于所有输入(例如,对此:abcabc 和 abcbcca)。我在这里想念什么?不是硬件,不是竞赛。练习DP。
public int longestCommonSubsequence(String input) {
char[] firstStr = this.string.toCharArray();
char[] secondStr = input.toCharArray();
int[][] maxLength = new int[firstStr.length+1][2];
for(int i=0; i <= firstStr.length; i++) {
maxLength[i][0] = 0;
}
for(int j=0; j < 2; j++) {
maxLength[0][j] = 0;
}
for(int i=0; i < firstStr.length; i++) {
for(int j=0; j < secondStr.length; j++) {
if(firstStr[i] == secondStr[j]) {
maxLength[i+1][1] = 1 + maxLength[i][0];
}
else {
maxLength[i+1][1] = maxLength[i][1]>maxLength[i+1][0]?maxLength[i][1]:maxLength[i+1][0];
}
}
//Copy second row to first row
for(int l =0; l < firstStr.length; l++) {
maxLength[l][0] = maxLength[l][1];
}
}
return maxLength[firstStr.length -1][0];
}
【问题讨论】:
-
是否应该嵌入前两个 for 循环? (和 maxLenght[i][j] = 0;)
-
没有。这意味着两列矩阵中的所有元素都将为零。不是我想要的。我希望该两列矩阵的第一列和第一行为 0。
标签: java string optimization dynamic-programming longest-substring