【LeetCode】面试题 01.05. 一次编辑

121 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

  • 题目示例

  • 题目解析

    • 单词操作有三种方式:删除、添加、替换
    • 两个字符串参数:first、second

二、思路分析:

我们从题目中,能获取到要求对两个字符串进行删除、添加或者替换操作之后,判断使它们相等的操作小于2次的结果,结果为布尔类型。

首先,通过题目我们可以先从两个字符串长度进行减法计算,有两种情况:

  • abs(len(first)-len(second)) > 1 时,则结果直接返回False

  • abs(len(first)-len(second)) < 2 时,则需要判断 first 和 second 字符串,各索引位置的字符是否相同,有三种情况结果为True

    • 当 first 和 second 两个字符串相同时,则无需操作 image.png
    • 当 first 与 second 长度相同,且只有一个字符不相同时,则进行替换差异的字符 image.png
    • 当 first 与 second 长度相差1时,则将较长的字符串删除差异的字符

    image.png

方法一:双指针

  • first字符串:定义一个 i 指针
  • second字符串:定义一个 j 指针
  • i 和 j 指针都分别指向字符串开始位置
  • 当 first[f] 与 second[d] 的字符串不相等时,则临时变量step进行+1
  • 同时判断 first 和 second 字符串长度,如果 len(first) > len(second) 长度时,则指针j 停留在原地;否则指针i停留在原地

image.png

根据上述思路,用python可以快速的实现出来,代码如下:

class Solution(object):

    def oneEditAway(self, first, second):

        """

        :type first: str

        :type second: str

        :rtype: bool

        """
        f = len(first)
        s = len(second)
        i,j = 0,0
        step = 0

        if abs(f-s) > 1:

            return False

        while i < f and j < s:

            if first[i] != second[j]:

                step = step + 1

                if step > 1 :

                    return False

                if f > s:

                    j = j -1

                elif s > f:

                    i = i - 1            

            i = i + 1

            j = j + 1

        return True

方法二:字符串分片法

我们可以使用分片的方法,来代替双指针。

同理,也是需要分情况讨论:

  • 当两个字符串长度差大于1时,则结果直接返回false
  • 当两个字符串长度相等时,first[i+1:]=second[i+1:]
  • 当两个字符串长度相差1时,则取较大的字符串[i+1:] = 较小的字符串[i:]
  • Python 中可以使用迭代对象enumerate和zip来辅助处理
class Solution(object):

    def oneEditAway(self, first, second):

        """

        :type first: str

        :type second: str

        :rtype: bool

        """

        f = len(first)

        s = len(second)

        if s > f :

            return self.oneEditAway(second,first)

        if f - s > 1:

            return False

        for i,(x,y) in enumerate(zip(first,second)):

            if x != y:

                if f == s :

                    return first[i + 1:] == second[i + 1:] 

                else :

                    return first[i + 1:] == second[i:]

        return True

三、总结:

本题考察我们对字符串中双指针遍历字符串处理能力,同时在python中,我们可以借助迭代对象方法来是我们对代码变得优雅。

  • 时间复杂度O(N),N为字符串长度
  • 空间复杂度O(1),没有额外使用空间(Python枚举方法,可以减少空间的损耗)

以上是本期内容,欢迎大佬们点赞评论,下期见~~