class Solution {
public boolean isOneEditDistance(String s, String t) {
// edge cases
if (s.length() == 0 && t.length() == 0
|| s.equals(t)) return false;
// length diff
boolean lenDiffFlag = false;
int lenDiff = s.length() - t.length();
if (Math.abs(lenDiff) > 1) return false;
if (Math.abs(lenDiff) == 1) lenDiffFlag = true;
String shrt = lenDiff > 0 ? t : s;
String lng = lenDiff > 0 ? s : t;
// char walk
int diff = 0;
for (int i = 0, j = 0; i < shrt.length() && j < lng.length(); i++, j++) {
if (shrt.charAt(i) != lng.charAt(j)) {
diff++;
if (lenDiffFlag) {
i--;
lenDiffFlag = false;
} // shorter one step back one char
}
if (diff > 1) return false;
}
// return
return true;
}
}
// edit: 1) insert/delete -> length diff 1, 2) change, length equal, one char diff
class Solution {
public boolean isOneEditDistance(String s, String t) {
// s for short, t for long;
if (s.length() > t.length()) return isOneEditDistance(t, s);
// length diff
int lenS = s.length(), lenT = t.length();
if (lenT - lenS > 1) return false;
// walk
for (int i = 0; i < lenS; i++) {
if (s.charAt(i) != t.charAt(i)) {
return s.substring(i+1).equals(t.substring(i+1))
|| s.substring(i).equals(t.substring(i+1));
}
}
return lenT > lenS; // this one is pretty counterintuitive...
}
}
class Solution {
public boolean isOneEditDistance(String s, String t) {
// edge cases
if (s == null || t == null || s.equals(t)
|| Math.abs(s.length() - t.length()) > 1)
return false;
// short long
String shrt = s.length() > t.length() ? t : s;
String lng = s.length() > t.length() ? s : t;
for (int i = 0; i < shrt.length(); i++) {
if (shrt.charAt(i) != lng.charAt(i)) {
return shrt.substring(i+1).equals(lng.substring(i+1)) // same length
|| shrt.substring(i).equals(lng.substring(i+1)); // long string has one more char
}
}
return true;
}
}