字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。
给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
解题思路:
1 长度差值 大于等于2 不符合要求
2 长度差值 1 or 0
比较两个串
(1)两个串不等长 遇到不同的长的跳过(假定此处为待删除元素)并计数, 如果大于等于两处不同返回错误
(2) 两个串等长 遇到对应位置不同元素 都跳过(假定此时为替换)并计数, 如果大于等于两处不同返回错误
.
class Solution:
def oneEditAway(self, first: str, second: str) -> bool:
first_len, second_len = len(first), len(second)
# 长度差值 大于等于2 不符合要求
if abs(first_len-second_len) >= 2:
return False
# 长度差值 == 1 or == 0
# 增加字符和删除字符都会使两个串差1
# 直接将长的短的恒定, 即可将插入和删除两个问题转换为删除这一个问题
if first_len > second_len:
long, short = first, second
else:
long, short = second, first
# 比较两个串
# 1 两个串不等长 遇到不同的长的跳过(假定此处为待删除元素)并计数, 如果大于等于两处不同返回错误
# 2 两个串等长 遇到对应位置不同元素 都跳过(假定此时为替换)并计数, 如果大于等于两处不同返回错误
diff, longIdx, shortIdx = 0, 0, 0
while shortIdx < len(short) and longIdx < len(long):
if long[longIdx] == short[shortIdx]:
longIdx += 1
shortIdx += 1
elif long[longIdx] != short[shortIdx] and first_len != second_len:
longIdx += 1
diff += 1
if diff >= 2:
return False
elif long[longIdx] != short[shortIdx] and first_len == second_len:
longIdx += 1
shortIdx += 1
diff += 1
if diff >= 2:
return False
else:
pass
return True