面试题 01.05. 一次编辑(Java)

该博客介绍了LeetCode的一道题目,讨论如何判断两个字符串是否只需要一次编辑操作就能相互转换。当字符串长度差超过1时,无法通过一次编辑转换。对于长度差1以内的字符串,使用指针比较并记录不同字符,通过递归处理各种情况来确定是否只需一次编辑。递归终止条件包括两指针都到达边界或一指针到达边界,根据之前是否有操作来判断结果。
摘要由CSDN通过智能技术生成

题目描述

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

示例:

示例1:

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

示例 2:

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

题目链接

递归

对于两字符串长度差超过1的情况,显然不可能通过一次编辑就可以让它们相同,所以直接返回false。
接下来就只需要考虑长度差在1以内的情况。用两个指针指向两字符串的开头,若出现了不相同的情况则记录下来,若之后再出现不同的字符则直接返回false。第一次发现不同字符之后可以有三种操作跳过first的字符(相当于删除first[i])、跳过second的当前字符(相当在first中填充了一个与当前second[i]相同的字符)、两个指针都向后移动一步(相当于修改一个字符)。
递归终止条件就是指针到达了边界,此时若是两个指针一起到达边界意味着只出现过一个或零个不同的元素返回ture,若是其中一个到达边界一个还未到达边界,则可能出现了以下几种情况:

  • 两字符串长度相同,没有进行过任何操作或者进行过修改操作。
  • 两字符串长度不同,没有进行过操作。
  • 两字符串长度不同,进行过操作。

这些情况只需要考虑之前是否进行过操作,若操作过则返回false否则返回true。

public static boolean oneEditAway(String first, String second) {
        if (Math.abs(first.length() - second.length()) > 1)
            return false;
        return oneEditAwayHelp(first, second, 0, 0, false);
    }

    private static boolean oneEditAwayHelp(String first, String second, int i, int j, boolean flag) {
        if (i == first.length() && j == second.length()) {
            return true;
        } else if (i == first.length() || j == second.length()){
            return !flag;
        }
        if (first.charAt(i) != second.charAt(j)) {
            if (flag == true)
                return false;
            boolean skipI = oneEditAwayHelp(first, second, i + 1, j, true);
            boolean skipJ = oneEditAwayHelp(first, second, i, j + 1, true);
            boolean skipTwo=oneEditAwayHelp(first, second, i + 1, j + 1, true);
            return skipI || skipJ || skipTwo;
        } else return oneEditAwayHelp(first, second, i + 1, j + 1, flag);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值