持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 单词操作有三种方式:删除、添加、替换
- 两个字符串参数:first、second
二、思路分析:
我们从题目中,能获取到要求对两个字符串进行删除、添加或者替换操作之后,判断使它们相等的操作小于2次的结果,结果为布尔类型。
首先,通过题目我们可以先从两个字符串长度进行减法计算,有两种情况:
-
当
abs(len(first)-len(second)) > 1时,则结果直接返回False -
当
abs(len(first)-len(second)) < 2时,则需要判断 first 和 second 字符串,各索引位置的字符是否相同,有三种情况结果为True- 当 first 和 second 两个字符串相同时,则无需操作
- 当 first 与 second 长度相同,且只有一个字符不相同时,则进行替换差异的字符
- 当 first 与 second 长度相差1时,则将较长的字符串删除差异的字符
- 当 first 和 second 两个字符串相同时,则无需操作
方法一:双指针
- first字符串:定义一个 i 指针
- second字符串:定义一个 j 指针
- i 和 j 指针都分别指向字符串开始位置
- 当 first[f] 与 second[d] 的字符串不相等时,则临时变量step进行+1
- 同时判断 first 和 second 字符串长度,如果 len(first) > len(second) 长度时,则指针j 停留在原地;否则指针i停留在原地
根据上述思路,用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枚举方法,可以减少空间的损耗)
以上是本期内容,欢迎大佬们点赞评论,下期见~~