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

1.题目

面试题 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.结果

面试题 01.05. 一次编辑-模拟_第2张图片

 

你可能感兴趣的:(LeetCode,程序员面试金典,java,leetcode)