一次编辑
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入:
first = “pale”
second = “ple”
输出: True
示例 2:
输入:
first = “pales”
second = “pal”
输出: False
python
解题思路:
分为三种情况,两个字符串长度相差大于一,通过一次编辑肯定不能,所以返回false,两个字符串长度相等,分别比较各个字符,只能有小于等于一个字符不同,否则返回flalse,第三种情况,两个字符串相差长度为1,
这种情况需要从第一个字符比较,如果不相等就那长度长字符串的下一个字符与第一个字符比较,还不相等的话就返回false,相同的话再继续比较两个字符串的下一个字符,以此类推,最多只能出现一次不同,否则返回false,例如plase,aase,第一次比较p,a不相等,在比较l,a还想等就返回false,
class Solution(object):
def oneEditAway(self, first, second):
"""
:type first: str
:type second: str
:rtype: bool
"""
if abs(len(first)==len(second))>1:
return False
if len(first)==len(second):
math = 0
for i in range(len(first)):
if first[i:i+1]!=second[i:i+1]:
math = math + 1
if math>1:
return False
else:
return True
tmp = 0
fmath = 0
smath = 0
for j in range(max(len(first),len(second))):
if first[fmath:fmath+1]!=second[smath:smath+1]:
tmp = tmp + 1
if len(first)>len(second):
fmath = fmath + 1
else:
smath = smath + 1
else:
fmath = fmath + 1
smath = smath + 1
if tmp >1:
return False
else:
return True
java
解题思路:
一开始定义hasContinue是false,当字符串各位都一样时就不会执行到第二个if,如果一直到最后执行结束还没有执行到第二个if,也就是for循环能够执行结束,就返回true代表字符串都一样所以肯定符合,当出现第一次字符不相等时,就更改hasContinue的值并且把长度短的索引减1,也就是下次比还是比长度短的这个字符,但是出现第二次不相等时就直接返回true。
class Solution {
public boolean oneEditAway(String first, String second) {
//判断长度差别是否满足一位以内
int a=first.length()-second.length();
if (a>1||a<-1){
return false;
}
char[] chars1 = first.toCharArray();
char[] chars2 = second.toCharArray();
//只能跳过一次
boolean hasContinue=false;
for (int i = 0,j=0; i < chars1.length&&j<chars2.length; i++,j++) {
if (chars1[i]==chars2[j]){
continue;
}else if(hasContinue){
return false;
}
if (a==1){
j--;
}else if(a==-1){
i--;
}
hasContinue=true;
}
return true;
}
}