问题简介
字符串有三种编辑操作,插入一个字符、删除一个字符或者替换一个字符,给定两个字符串s1和s2,s1是否只需一次或零次变换成为s2。
例如:
输入:
s1=“spend”
s2=“speed”
输出:
True
解答
思路:对于替换:长度相同,不相同字符只能为一个,依次遍历字符串计算不相同的字符个数即可;对于插入和删除:长度不等且相差为1,则长串某一位去掉之后可以匹配短串。
上代码:
def change(s1,s2):
lists1=list(s1)
lists2=list(s2)
not_same=[]
#长度相同,不同字符只能出现一次
if len(lists1)==len(lists2):
not_same=[x for x,y in zip(lists1,lists2) if x!=y] #并行遍历:zip,zip返回zip迭代对象,可以包在list调用中显示结果
if len(not_same) in [0,1]:
return True
else:
return False
#长度不同,去掉长的某一位可以变成另一个
if len(lists1)-len(lists2)==1 or -1:
maxlist=(lists1 if (len(lists1)>len(lists2)) else lists2)
minlist=(lists1 if (len(lists1)<len(lists2)) else lists2)
for i in range(len(maxlist)):
return maxlist[:i]+maxlist[i+1:]==minlist #lists1[:i]+lists1[i+1:] 即去掉下标为i的