Given two strings S and T, determine if they are both one edit distance apart.

给定两个字符串,判断他们是否是一步变换得到的。

 

在这里需要注意几点:

1、不等于1的变换都要返回false(包括变换次数等于0)。

2、还有很多细节需要注意。

 

方法如下:

1、直接判断:1)如果差值大于1,直接返回false。

        2)如果长度相同,那么依次判断,是否只有一个字母不一样。

        3)如果不一样,那么看是否是只是多出了一个字母。

public class Solution {
    public boolean isOneEditDistance(String s, String t) {
        int len1 = s.length();
        int len2 = t.length();
        if (len1 < len2){
            return isOneEditDistance(t, s);
        }
        if (len1 - len2 > 1){
            return false;
        }
        boolean flag = false;
        if (len1 == len2){
            for (int i = 0; i < len1; i++){
                if (s.charAt(i) != t.charAt(i)){
                    if (!flag){
                        flag = true;
                    } else {
                        return false;
                    }
                }
            }
            return flag;
        } else {
            int sStart = 0;
            int tStart = 0;
            while (tStart < len2){
                if (s.charAt(sStart) == t.charAt(tStart)){
                    tStart++;
                    sStart++;
                } else {
                    if (!flag){
                        flag = true;
                        sStart++;
                    } else {
                        return false;
                    }
                }
            }
            return true;
        }
    }
}

 

 

2、利用substring和equals来判断,代码会简洁很多。

public 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));
                } else if (s.length() == t.length() - 1){
                    return s.substring(i).equals(t.substring(i + 1));
                } else {
                    return s.substring(i + 1).equals(t.substring(i));
                }
            }
        }
        return Math.abs(s.length() - t.length()) == 1;
    }
}

 

这两者的速度都差不多,都是2ms左右,答案有一些是1ms,将string换成char[]就可以了,所以就没贴上去的必要了。