LeetCode刷题(六)

208 阅读2分钟

一次编辑

字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。

示例 1:

输入:
first = “pale”
second = “ple”
输出: True

示例 2:

输入:
first = “pales”
second = “pal”
输出: False

python

解题思路:
分为三种情况,两个字符串长度相差大于一,通过一次编辑肯定不能,所以返回false,两个字符串长度相等,分别比较各个字符,只能有小于等于一个字符不同,否则返回flalse,第三种情况,两个字符串相差长度为1,
这种情况需要从第一个字符比较,如果不相等就那长度长字符串的下一个字符与第一个字符比较,还不相等的话就返回false,相同的话再继续比较两个字符串的下一个字符,以此类推,最多只能出现一次不同,否则返回false,例如plase,aase,第一次比较p,a不相等,在比较l,a还想等就返回false,

class Solution(object):
    def oneEditAway(self, first, second):
        """
        :type first: str
        :type second: str
        :rtype: bool
        """
        if abs(len(first)==len(second))>1:
            return False
        if len(first)==len(second):
            math = 0
            for i in range(len(first)):
                if first[i:i+1]!=second[i:i+1]:
                    math = math + 1
            if math>1:
                return False
            else:
                return True
        tmp = 0
        fmath = 0
        smath = 0
        for j in range(max(len(first),len(second))):
            if first[fmath:fmath+1]!=second[smath:smath+1]:
                tmp = tmp + 1
                if len(first)>len(second):
                    fmath = fmath + 1
                else:
                    smath = smath + 1
            else:
                fmath = fmath + 1
                smath = smath + 1
        if tmp >1:
            return False
        else:
            return True

java

解题思路:
一开始定义hasContinue是false,当字符串各位都一样时就不会执行到第二个if,如果一直到最后执行结束还没有执行到第二个if,也就是for循环能够执行结束,就返回true代表字符串都一样所以肯定符合,当出现第一次字符不相等时,就更改hasContinue的值并且把长度短的索引减1,也就是下次比还是比长度短的这个字符,但是出现第二次不相等时就直接返回true。

class Solution {
public boolean oneEditAway(String first, String second) {
        //判断长度差别是否满足一位以内
        int a=first.length()-second.length();
        if (a>1||a<-1){
            return false;
        }
        char[] chars1 = first.toCharArray();
        char[] chars2 = second.toCharArray();
        //只能跳过一次
        boolean hasContinue=false;
        for (int i = 0,j=0; i < chars1.length&&j<chars2.length; i++,j++) {
            if (chars1[i]==chars2[j]){
                continue;
            }else if(hasContinue){
                return false;
            }
            if (a==1){
                j--;
            }else if(a==-1){
                i--;
            }
            hasContinue=true;
        }
        return true;
    }
}