6 月更文挑战· 一次编辑

81 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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

期待下次再见~

\