刷题力扣面试题 01.05. 一次编辑

题目链接

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/one-away-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目描述

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

示例 1:

输入: 
first = "pale"
second = "ple"
输出: True

示例 2:

输入: 
first = "pales"
second = "pal"
输出: False

题目分析

  1. 根据题目描述,判断是否可以经过一次操作(删除、插入和修改)将一个字符串变为另一个字符串
  2. 三种操作每次只变动一个字符,可以确定当两个字符串的长度差超过1的时候,一定不可以
  3. 故可以分为两种情况,长度相等、长度差为1
  4. 当长度相等时,对应位置字符不一致的情况只可以出现一次
  5. 当长度差为1时,剩下的字串相等

代码

class Solution {
public:
    bool oneEditAway(string first, string second) {
        int firstLen = first.length();
        int secondLen = second.length();
        int clash = 0;
        int i = 0;
        if (abs(firstLen - secondLen) > 1) { return false; }
        if (firstLen == secondLen) {
            for (i = 0; i < firstLen; ++i) {
                if (first[i] != second[i]) { ++clash; }
            }
            return clash > 1 ? false : true;
        } else {
            for (i = 0; i < min(firstLen, secondLen); ++i) {
                if (first[i] != second[i]) {
                    if (first.substr(i, firstLen - i + 1) == second.substr(i + 1, secondLen - i) or first.substr(i + 1, firstLen - i) == second.substr(i, secondLen - i + 1)) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }
            return true;
        }
        return true;
    }
};
原文地址:https://www.cnblogs.com/HanYG/p/15797753.html