程序员面试金典——面试题01.05.一次编辑

一、题目介绍

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

示例 1:

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

示例 2:

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

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

二、解题思路

本题采用双指针法,具体情况如下:

  • 两个字符串的长度之差不能大于1。
  • 当first[i] == second[j]时,则i++, j++。
  • 当first[i] != second[j]时,如果first[i+1] == second[j] ,则i++,count++(编辑次数);如果first[i] == second[j+1],则j++,count++;即可以通过删除一个字符操作,使两个字符串相同。
  • 其他情况下,i++,j++,count++,即可以通过插入或者替换一个字符操作,使两个字符串相同。
  • 最后当i或j中某个指针,指向first或者second字符串的结尾时,统计max(first.size()-i, second.size()-j) + count的值,如果小于等于1返回true,否则返回false。

三、解题代码

class Solution {
public:
    bool oneEditAway(string first, string second) {
        int len1 = first.size();
        int len2 = second.size();
        if(abs(len1-len2) > 1)
            return false;
        int i = 0, j = 0;
        int count = 0;
        while(i < len1 && j < len2)
        {
            if(first[i] == second[j])
            {
                ++i;
                ++j;
            }
            else
            {
                //删除一个字符
                if(first[i+1] == second[j])
                    ++i;
                //删除一个字符
                else if(first[i] == second[j+1])
                    ++j;
                //插入一个字符,或者替换一个字符
                else
                {
                    ++i;
                    ++j;
                }
                ++count;
            }
        }
        if(max(len1-i, len2-j)+count > 1)//当某一个指针先到达字符串结尾时,即两个字符串长度不一致的情况
            return false;
        return true;
    }
};

四、解题结果

猜你喜欢

转载自blog.csdn.net/qq_39661206/article/details/105628501
今日推荐