1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| public class EditDistanceSearch {
public static List<String> findSimilarSubstrings(String target, String longString, int threshold) { List<String> similarSubstrings = new ArrayList<>(); for (int i = 0; i < longString.length() - target.length(); i++) { String substring = longString.substring(i, i + target.length()); int distance = calculateEditDistance(substring, target); if (distance <= threshold) similarSubstrings.add(substring); }
return similarSubstrings; }
public static int calculateEditDistance(String str1, String str2) { int m = str1.length(); int n = str2.length();
int[][] dp = new int[m + 1][n + 1]; for (int i = 0; i <= m; i++) { dp[i][0] = i; } for (int j = 0; j <= n; j++) { dp[0][j] = j; }
for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { if (str1.charAt(i - 1) == str2.charAt(j - 1)) { dp[i][j] = dp[i - 1][j - 1]; } else { dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i][j - 1], dp[i - 1][j])) + 1; } } }
return dp[m][n]; }
public static void main(String[] args) { String target = "kitten"; String longString = "skittlesittingbingocat"; int threshold = 2;
List<String> similarSubstrings = findSimilarSubstrings(target, longString, threshold);
System.out.println("找到相似子串:"); for (String substring : similarSubstrings) { System.out.println(substring); } } }
|