One Edit Distance

来源:互联网 发布:店铺宝贝优化 编辑:程序博客网 时间:2024/05/22 06:30

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][n] == 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;    }}


0 0
原创粉丝点击