您的位置:首页 > 其它

One Edit Distance

2014-12-10 15:03 211 查看
Given two strings S and T, determine if they are both one edit distance apart.

思路:可以用edit distance的方法来做,但是超时,这个方法是O(m*n) 空间是O(m*n)

public class Solution {
    public boolean isOneEditDistance(String s, String t) {
        int m = s.length();
        int n = t.length();
        if(Math.abs(m-n) >=2) return false;
        int[][] dp = new int[m+1][n+1];
        
        for(int i=0; i<m+1; i++){
            for(int j=0; j<n+1; 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 {
                        dp[i][j] = 1 + Math.min(dp[i-1][j-1],Math.min(dp[i][j-1],(dp[i-1][j])));
                    }
                }
            }
        }
        return dp[m]
== 1;
        
    }
}

思路2:利用只需要判断一个edit这个特点,如果只有1个edit操作,只有以下几种情况:

1. 长度相同,那么只有一个update操作,就数一下,如果有第二个不相同,那就return false;

2. 长度差1,那么就有insert或者delete操作,找到长string的,第一不相同的位置,那么长string后面的应该与短string相同,否则return false

3. 长度差大于1,return false;

这个方法可以到O(n).

public class Solution {
    public boolean isOneEditDistance(String s, String t) {
        if(s == null || t == null) return false;
        int m = s.length(); 
        int n = t.length();
        if(Math.abs(m - n)>=2) return false;
        if(m == n) return isOneDiff(s,t);
        if(m - n == 1) return isOneUpdate(s, t);
        if(n - m == 1) return isOneUpdate(t, s);
        return false;
    }
    
    public boolean isOneDiff(String s, String t){
        if(s.length() == 0 && t.length() == 0) return false;
        boolean find = false;
        for(int i=0; i<s.length(); i++){
            if(s.charAt(i) != t.charAt(i)){
                if(!find){
                    find = true;
                } else {
                    return false;
                }
            }
        }
        return find;
    }
    
    // s.length() > t.length();
    public boolean isOneUpdate(String s, String t){
        int index = 0;
        for(int i=0; i<t.length(); i++){
            if(s.charAt(i)!=t.charAt(i)){
                return s.substring(i+1).equals(t.substring(i));
            }
        }
        return true;
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: