leetcode 链接:一次编辑

题目

字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次 (或者零次) 编辑。

示例:

  1. 输入: first = "pale", second = "ple"
  2. 输出: true
  3. 输入: first = "pales", second = "pal"
  4. 输出: false
  5. 输入: first = "pale", second = "bale"
  6. 输出: true
  7. 输入: first = "pale", second = "bake"
  8. 输出: false

解答 & 代码

比较两个字符串 fisrtsecond 的长度,分为 4 种情况:

  • 长度相同:若为一次/零次编辑,则只能是替换了一个字符或者没有变化
    • 逐个比较两个字符串的字符,若有超过一个字符不同,则返回 false,否则返回 true
  • first 的长度比 second 长一个字符:若为一次编辑,则只能是 first 删除了一个字符
    • 先逐个比较两个字符串的字符,找出第一次不同的位置
    • first 跳过该位置(second 不跳),从下一位置开始继续与 second 的字符比较,若又出现不同,则返回 false;若都相同,则返回 true
  • first 的长度比 second 短一个字符:若为一次编辑,则只能是 first 插入了一个字符
    • 先逐个比较两个字符串的字符,找出第一次不同的位置
    • second 跳过该位置(first 不跳),从下一位置开始继续与 first 的字符比较,若又出现不同,则返回 false;若都相同,则返回 true
  • else:返回 false

    class Solution {
    public:
      bool oneEditAway(string first, string second) {
          if(first.size() == second.size())
          {
              int diff_cnt = 0;
              for(int i = 0; i < first.size(); ++i)
              {
                  if(first[i] != second[i])
                      ++diff_cnt;
                  if(diff_cnt > 1)
                      return false;
              }
              return true;
          }
    
          else if(first.size() - second.size() == 1)
          {
              int i = 0;
              for(; i < second.size() && first[i] == second[i]; ++i)
              {
              }
    
              for(; i < second.size(); ++i)
              {
                  if(first[i + 1] != second[i])
                      return false;
              }
              return true;
          }
    
          else if(second.size() - first.size() == 1)
          {
              int i = 0;
              for(; i < first.size() && first[i] == second[i]; ++i)
              {
              }
    
              for(; i < first.size(); ++i)
              {
                  if(first[i] != second[i + 1])
                      return false;
              }
              return true;
          }
    
          else
              return false;
      }
    };
    

    执行结果: ``` 执行结果:通过

执行用时:4 ms, 在所有 C++ 提交中击败了 73.72% 的用户 内存消耗:6 MB, 在所有 C++ 提交中击败了 85.87% 的用户 ```