每日算法----一次编辑----2022/05/13

1. 题目描述

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

2. 示例

示例 1:

输入: 
first = "pale"
second = "ple"
输出: True

示例 2:

输入: 
first = "pales"
second = "pal"
输出: False

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/one-away-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

3. 思路

可以转变思路,看两字符串相差字符个数分情况如下:

  • 两字符串长度差值大于等于2,题目要求1次或者0次修改,长度差2的时候不可能满足条件,返回false
  • 两字符串长度差值为1时,对比两字符串的各位置的字符,根据相差字符串的个数进行判断,如果相差字符数量为1,则通过加减字符串都可以满足要求返回true。不满足返回false
  • 两字符串长度差值为0时,相差字符数量为1或0时满足条件返回true,其余情况返回false
4. 遇上的问题

问题描述:字符串差值为1时,遍历循环到短字符串尾部时,循环跳出条件没确定好。导致错误跳出循环。
解决方案:原来写的是first字符串的索引等于second字符串长度时跳出。后来改为second字符串的索引等于second字符串长度时跳出。

5. 具体实现代码

自己写的代码

func oneEditAway(first string, second string) bool {
    //两字符相等的情况
    if first == second{
        return true
    }
    //两字符差值>=2的情况
    if len(first) - len(second) >= 2 || len(first) - len(second) <= -2{
        return false
    }
    //两字符差值==1的情况
    if len(first) - len(second) == 1 || len(first) - len(second)== -1{
        if len(first) - len(second) == -1{
            temp := first
            first = second
            second = temp
        }
        diffCount := 0
        secondNum := 0 
        for i := 0 ; i <len(first) ; i++{
            if diffCount > 1{
                return false
            }
            //循环跳出条件
            if secondNum == len(second){
                diffCount++
                break
            }
            if first[i] != second[secondNum]{
                diffCount++
                secondNum--
            }
            secondNum++
        }
        if diffCount != 1 {
            return false
        }
        return true
    }
    //字符串长度相等的情况。
    diffCount := 0
    for i := 0 ; i <len(first) ; i++{
        if first[i] != second[i]{
            diffCount++
        }
    }
    if diffCount == 1{
        return true
    }
    return false
}
6. 官方题解
func oneEditAway(first, second string) bool {
    m, n := len(first), len(second)
    if m < n {
        return oneEditAway(second, first)
    }
    if m-n > 1 {
        return false
    }
    for i, ch := range second {
        if first[i] != byte(ch) {
            if m == n {
                return first[i+1:] == second[i+1:]
            }
            return first[i+1:] == second[i:]
        }
    }
    return true
}

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/one-away-lcci/solution/yi-ci-bian-ji-by-leetcode-solution-2xkr/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

阿这,看了官方题解,更加便捷,不需要每个字符的去比较,字符串差值为1时可以用两字符串当前位置后面的字符串直接做比较,喵喵喵喵喵喵。

7 题目来源

leetCode


当比较字符串时,如果是只允许一个字符不同,在发现不同字符后,可以直接比较后续字符串!! ------swrici

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值