面试题 01.05. 一次编辑-模拟

1.题目

2.思路

这个题,第一反应就是模拟就好了,首先计算两个字符的长度n, m.注意边界条件。

  • 如果两个的长度只差 == 1 或者 0, 那么有可能返回true。
  • 如果不等,那么直接返回false.

第一次提交的时候,由于考虑不够完善,导致用例只过了百分90.一开始想的,让两个字符的指针同时移动,只要相等,就移动。只要不相等,就用一个计数器cnt++.,并且两个指着也是同时右移。当计数器大于1的时候,就说明肯定不符合条件,返回false.---过90%

错误例子:"island" 和 “land”

按照上面的想法,一开始比较i 和 l , 不相等所以计数器+ 1, 这时候同时移动,所以导致下一个比较的是s 和 a,也不想等,这样计数器再+ 1,所以导致结果不对。

正确思路:在上面的思路上修改一下移动指针就可以了。上面的思路其实是建立在一一对应的基础上,也就是说n == m 的时候,是可以保证正确的,但是n == m  - 1 , 和 n == m + 1的情况是不对的。所以可以分成三个情况来单独讨论。n = m 时候,就用上面思路即可。n = m - 1 和 n = m + 1是类似的,所以选择一种情况分析一下(比如n = m - 1),另一个情况照着写也就可以了。

  • 当两者相等的时候,同时移动指针i 和 指针 j.(i 指向 n 字符串; j 指向 m 字符串)
  • 当两者不相等的时候,应该让长度大一点的指针 + 1,这里也就是指向m字符串的 j 指针 + 1,并且cnt + 1(此时指针i 是不需要 + 1).  cnt > 1,那么直接返回false即可。
class Solution {
    public boolean oneEditAway(String first, String second) {
        int n = first.length();
        int m = second.length();
        if(Math.abs(n - m) > 1)return false;
        if(first.equals(second)) return true;
        int min = Math.min(n, m);
        
        if(n == m){
            int cnt = 0;
            for(int i = 0 ; i < min ; i++){
                if(first.charAt(i) == second.charAt(i))
                    continue;
                else{
                    cnt++;
                    if(cnt >= 2) return false;
                }
            }
            return true;
        }
        else if(n == m - 1){
            int j = 0;
            int cnt = 0 ;
            for(int i = 0 ; i < m ; i++){
                if(j < n && first.charAt(j) == second.charAt(i)){
                    j++;
                    continue;
                }
                    
                else{
                    cnt++;
                    if(cnt >= 2) return false;

                }
            }
            return true;
        }
        else{ // n == m + 1
            int j = 0;
            int cnt = 0;
            for(int i = 0 ; i < n ; i++){
                if(j < m && first.charAt(i) == second.charAt(j)){
                    j++;
                    continue;
                }
                    
                else{
                    cnt++;
                    if(cnt >= 2) return false;
                    
                }
            }
            return true;
        }
       
    }
}

时间复杂度--O(Max(N, M))线性时间复杂度。

注意:使用s.charAt(i)记得判断i 是否越界。

优化:可以把后面的两种情况写成一个情况,n == m - 1 和 m == n - 1.

(题解中还有用三维dp, 时间复杂度比这个大)

3.结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值