Java&C++题解与拓展——leetcode面试题01.05.一次编辑【么的新知识】

106 阅读1分钟
每日一题做题记录,参考官方和三叶的题解

题目要求

在这里插入图片描述

思路:模拟

  • 先比较两字符串长度mmnn,长度差异大于11直接falsefalse
  • 长度差异不超过11,遍历两字符串(人为保证first较短):
    • first[i]=second[j]first[i]=second[j],向后继续遍历检查;
    • first[i]second[j]first[i]\ne second[j]
      • m=nm=n,则需替换当前位,需修改位数modmod加一;
      • mnm\ne n,则可能是到了缺少的那一位上,将遍历secondsecond的指针后移,同时需修改位数modmod加一。
  • 最后只需判断需修改位数modmod即可。

Java

class Solution {
    public boolean oneEditAway(String first, String second) {
        int n = first.length(), m = second.length();
        if(Math.abs(n - m) > 1) // 长度差异大于1
            return false;
        if(n > m) // 保证first更短
            return oneEditAway(second, first);
        int i = 0, j = 0, mod = 0;
        while(i < n && j < m && mod <= 1) {
            char cf = first.charAt(i), cs = second.charAt(j);
            if(cf == cs) {
                i++;
                j++;
            }
            else {
                if(n == m) { // 长度相等仅需替换
                    i++;
                    j++;
                    mod++;
                }
                else { // 长者后移一位
                    j++;
                    mod++;
                }
            }
        }
        return mod <= 1;
    }
}
  • 时间复杂度:O(max(m,n))O(\max(m,n))
  • 空间复杂度:O(1)O(1)

C++

class Solution {
public:
    bool oneEditAway(string first, string second) {
        int n = first.size(), m = second.size();
        if(abs(n - m) > 1) // 长度差异大于1
            return false;
        if(n > m) // 保证first更短
            return oneEditAway(second, first);
        int i = 0, j = 0, mod = 0;
        while(i < n && j < m && mod <= 1) {
            char cf = first[i], cs = second[j];
            if(cf == cs) {
                i++;
                j++;
            }
            else {
                if(n == m) { // 长度相等仅需替换
                    i++;
                    j++;
                    mod++;
                }
                else { // 长者后移一位
                    j++;
                    mod++;
                }
            }
        }
        return mod <= 1;
    }
};
  • 时间复杂度:O(max(m,n))O(\max(m,n))
  • 空间复杂度:O(1)O(1)

Rust

impl Solution {
    pub fn one_edit_away(first: String, second: String) -> bool {
        let n = first.len();
        let m = second.len();
        if n > m { // 保证first更短
            return Solution::one_edit_away(second, first);
        }  
        if m - n > 1 { // 长度差异大于1
            return false;
        }
        let mut i = 0;
        let mut j = 0;
        let mut modi = 0;
        let first: Vec<char> = first.chars().collect();
        let second: Vec<char> = second.chars().collect();
        while i < n && j < m && modi <= 1 {
            if first[i] == second[j] {
                i += 1;
                j += 1;
            }
            else {
                if m == n { // 长度相等仅需替换
                    i += 1;
                    j += 1;
                    modi += 1;
                }
                else { // 长者后移一位
                    j += 1;
                    modi += 1;
                }
            }
        }
        modi <= 1
    }
}
  • 时间复杂度:O(max(m,n))O(\max(m,n))
  • 空间复杂度:O(1)O(1)

总结

快乐模拟,自己写出来了Rust~
重做PPT辣


欢迎指正与讨论!