https://oj.leetcode.com/problems/one-edit-distance/
Given two strings S and T, determine if they are both one edit distance apart.
public boolean isOneEditDistance(String s, String t)
这一题和Edit Distance的区别在于Edit Distance让我们求的是总数,这一题要求的是是否一次操作可以从S变成T。也就是要不就删除或插入一个字符,要不就改变一个字符。这样子这一题的做法就完全不一样了。
首先来看删除/插入操作,如果是这个操作的话,必然两者的长度是相差一的。
但如果是替换字符的操作,那么两者的长度是一样的。
所以我们可以从S和T的长度差来做到底是哪一种操作的判断。
当长度相等的时候,必然就是替换操作,当长度差为1的时候,必然就是删除/插入操作。当长度差大于1的时候,直接可以返回false了。
然后我们就可以进行s和t的同步比较了。当出现第一个字符不相等的时候,如果是替换操作,则两者继续同步前进。如果是删除/插入操作的时候,长度较为短的一方可以倒退一步。当如果出现第二次字符不相等的时候,我们就可以返回false了。但如果接下来的都能完全匹配,则就是true。根据上述算法,给出代码如下:
public boolean isOneEditDistance(String s, String t) {
String longer = s.length() > t.length() ? s : t;
String shorter = longer == s ? t : s;
if(longer.length() - shorter.length() > 1)return false;
boolean isDelete = longer.length() > shorter.length();
boolean oneEdited = false;
for(int i = 0, j = 0; i < longer.length() && j < shorter.length(); i++, j++){
if(longer.charAt(i) != shorter.charAt(j)){
if(oneEdited)
return false;
oneEdited = true;
j = isDelete ? j - 1 : j;
}
}
return oneEdited || isDelete;
}
这里有一个trick,当两个字符串相等的时候,也是要返回false的。所以oneEdited或者isDelete必须要有起码一个是true。之所以oneEdited不能作为完全判断是因为如果其中一个字符串是空的,是不会进入循环的,但是isDeleted会因为长度差为一而是true。所以这是必须的。