持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
一、题目描述:
字符串有三种编辑操作:插入一个英文字符、删除一个英文字符或者替换一个英文字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
示例 1:
输入: first = "pale" second = "ple" 输出: True
示例 2:
输入: first = "pales" second = "pal" 输出: False
来源:力扣(LeetCode) 链接:leetcode.cn/problems/on… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
定义双指针一一对比,分三种情况:
情况1:两字符串长度差值大于1,这不是一次编辑能解决的了
情况2:长度相等。逐位匹配,不匹配的字符大于一个了,那也不是一次编辑能解决的了
情况3:两字符串长度差值等于1,有两种解法:暴力和双指针。 难点就是怎么对两长度差值为1的字符串进行匹配判断。
暴力解法判断
三、AC 代码:
class Solution {
public boolean oneEditAway(String first, String second) {
int n=first.length();
int m=second.length();
if(Math.abs(n-m)>=2)
return false;
if(Math.abs(n-m)==1)
{
int ans=0;
for(int i=0,j=0;i<Math.min(n,m)||j<Math.min(n,m);i++,j++)
{
if(first.charAt(i)!=second.charAt(j))
{ans++;
if(ans==1)
{
System.out.println(j);
if(Math.min(n,m)-1==i||Math.min(n,m)-1==j)
{
if(m<n)
{
if(first.charAt(i+1)==second.charAt(j)) return true;
else return false;
}
else
{
if(first.charAt(i)==second.charAt(j+1)) return true;
else return false;
}
}
if(first.charAt(i+1)==second.charAt(j))
{
i++;
if(n<m)
return false;
}
else if(first.charAt(i)==second.charAt(j+1))
{
j++;
if(n>m)
return false;
}
else return false;
}
else return false;
}
}
}
if(n==m)
{
int cnt=0;
for(int i=0;i<n;i++)
{
if(first.charAt(i)!=second.charAt(i))
cnt++;
if(cnt>=2) return false;
}
}
return true;
}
}
四、总结:
今天这个题主要是分情况讨论,想明白各种情况,思路就清晰
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助,期待您找到心意的工作和满意的offer
期待下次再见~
\