Given two strings S and T, determine if they are both one edit distance apart.
思路:可以用edit distance的方法来做,这个方法是O(m*n) 空间是O(m*n)
class Solution {
public boolean isOneEditDistance(String s, String t) {
int m = s.length();
int n = t.length();
int[][] dp = new int[m + 1][n + 1];
for(int i = 0; i <= m; i++) {
for(int j = 0; j <= n; j++) {
if(i == 0) {
dp[i][j] = j;
} else if(j == 0) {
dp[i][j] = i;
} else {
if(s.charAt(i - 1) == t.charAt(j - 1)) {
dp[i][j] = dp[i - 1][j - 1];
} else {
// word1[i] != word2[j];
dp[i][j] = Math.min(dp[i][j - 1], Math.min(dp[i - 1][j], dp[i - 1][j - 1])) + 1;
}
}
}
}
return dp[m][n] == 1;
}
}
思路2:利用只需要判断一个edit这个特点,如果只有1个edit操作,只有以下几种情况:
if s[i] != t[i],
1. slen == tlen, replace, s.substring(i + 1) == t.substring(i + 1);
2. slen > tlen: delete s char, s.substring(i + 1) == t.substring(i)
3. slen < tlen: insert s char, s.substring(i) == t.substring(i + 1)
这个方法可以到O(n).
class Solution {
public boolean isOneEditDistance(String s, String t) {
for(int i = 0; i < Math.min(s.length(), t.length()); i++) {
if(s.charAt(i) != t.charAt(i)) {
if(s.length() == t.length()) {
return s.substring(i + 1).equals(t.substring(i + 1)); // replace;
} else {
// s.length() != t.length();
if(s.length() > t.length()) {
return s.substring(i + 1).equals(t.substring(i)); // delete schar;
} else {
// s.length() < t.length();
return s.substring(i).equals(t.substring(i + 1)); // insert schar;
}
}
}
}
return Math.abs(s.length() - t.length()) == 1;
}
}