ボトムアップの動的プログラミングを使用して、2 つの String オブジェクトの LCS を記述しようとしています。スペースで適切に機能させることができますO(mn)
。ただし、ご覧のとおり、前の列がすべて必要なわけではありません。そこで、スペースが になるように 2 列に収まるように変更しようとしましたO(m)
。ただし、すべての入力に対して機能するわけではありません (たとえば、 this: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];
}