双指针:161. 相隔为 1 的编辑距离

Smile_slime_47

原题地址:https://leetcode.cn/problems/one-edit-distance/

题解

两个字符串编辑距离为1只有2种情况:

  • 两个字符串长度相等,且仅有一个字符不等
  • 两个字符串长度仅相差1,且长的字符串仅仅是短的字符串插入一个字符

用一个flag记录下修改次数,指针i和j分别指向s和t的对应下标

对于长度相等的情况,不断比较i和j指向字符,当i和j指向字符不等时,记录修改次数,下一次再次遇到i和j指向字符不等时则说明编辑距离大于1,返回false

对于长度不等的情况,不断比较i和j指向的字符,当i和j指向字符不等时,有可能其中一个是多出来的字符,对于较长的字符串,我们让对应的指针++,此时应当跳过了那个多余的字符,因此可以继续比较,下一次再次遇到i和j指向字符不等时则说明编辑距离大于1,返回false

时间复杂度:O(N)

空间复杂度:O(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
public boolean isOneEditDistance(String s, String t) {
if(s.equals(t)||Math.abs(s.length()-t.length())>=2)return false;
boolean flag=true;
int i=0,j=0;
if(s.length()==t.length()){
while(i<s.length()&&j<t.length()){
if(flag&&s.charAt(i)!=t.charAt(j)){
flag=false;
}else if(!flag&&s.charAt(i)!=t.charAt(j)){
return false;
}
i++;
j++;
}
}else{
while(i<s.length()&&j<t.length()){
if(flag&&s.charAt(i)!=t.charAt(j)){
flag=false;
if(s.length()<t.length())j++;
else i++;
}else if(!flag&&s.charAt(i)!=t.charAt(j)){
return false;
}else{
i++;
j++;
}
}
}
return true;
}
}
Comments
On this page
双指针:161. 相隔为 1 的编辑距离