One Edit Distance

来源:互联网 发布:excel2017 数据有效性 编辑:程序博客网 时间:2024/06/04 23:03

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。所以这是必须的。

0 0
原创粉丝点击