我正試圖解決edit distance問題。我一直在使用的代碼如下。大字符串編輯距離解決方案
public static int minDistance(String word1, String word2) {
int len1 = word1.length();
int len2 = word2.length();
// len1+1, len2+1, because finally return dp[len1][len2]
int[][] dp = new int[len1 + 1][len2 + 1];
for (int i = 0; i <= len1; i++) {
dp[i][0] = i;
}
for (int j = 0; j <= len2; j++) {
dp[0][j] = j;
}
//iterate though, and check last char
for (int i = 0; i < len1; i++) {
char c1 = word1.charAt(i);
for (int j = 0; j < len2; j++) {
char c2 = word2.charAt(j);
//if last two chars equal
if (c1 == c2) {
//update dp value for +1 length
dp[i + 1][j + 1] = dp[i][j];
} else {
int replace = dp[i][j] + 1 ;
int insert = dp[i][j + 1] + 1 ;
int delete = dp[i + 1][j] + 1 ;
int min = replace > insert ? insert : replace;
min = delete > min ? min : delete;
dp[i + 1][j + 1] = min;
}
}
}
return dp[len1][len2];
}
這是一種DP方法。這個問題,因爲它使用二維數組我們不能解決這個問題,使用上面的方法大字符串。例如:字符串長度> 100000.
那麼無論如何修改這個算法來克服這個困難?
注意: 上述代碼將準確地解決小字符串的編輯距離問題。 (其長度低於1000或接近)
正如您在代碼中看到的,它使用Java 2D數組「dp [] []」。所以我們不能爲大的行和列初始化二維數組。
例如:如果我需要檢查2個字符串,其長度超過10
int[][] dp = new int[len1 + 1][len2 + 1];
以上將是
int[][] dp = new int[100000][100000];
所以這會給出一個計算器錯誤。
所以上面的程序只適合小長度的字符串。 我問的是,有沒有什麼辦法來解決這個問題的大型字符串(長度> 100000)在Java中有效。
爲什麼輸入了這麼長時間?也許更多地瞭解情況會讓我們提出更好的選擇。 – 2014-10-06 10:22:26
這是我們想要比較長度超過100000的兩個字符串的情況。在這種情況下,我們不能創建Java二維數組。 – prime 2014-10-06 10:23:40
@jurgemaister:我增加了一些細節。這不是一個作業:) – prime 2014-10-06 10:29:40