编程语言
首页 > 编程语言> > 程序员面试金典好题/面试题 01.05. 一次编辑

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

作者:互联网

面试题 01.05. 一次编辑

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

示例 1:

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

示例 2:

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

解题方法:

动态规划法:

class Solution {
public:
    bool oneEditAway(string first, string second) 
    {
        int n = first.size();
        int m = second.size();
        if(n - m > 1)
            return false;
        vector<vector<int>> dp(n + 1,vector<int>(m + 1,0));

        //当第一个字符串为""
        for (int j = 1; j <= m; j++) {

            dp[0][j] = j;
        }
        //当第二个字符串为""
        for (int i = 1; i <= n; i++) 
        {
            dp[i][0] = i;
        }

        for(int i = 1; i <= n;i++)
        {
            for(int j = 1; j <= m;j++)
            {
                if(first[i - 1] == second[j - 1])
                    dp[i][j] = dp[i - 1][j - 1];
                else
                    dp[i][j] = min({dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1});
            }
        } 

        int SizeMax = max(n,m);
        if(dp[n][m] > 1)
            return false;
        return true; 
    }
};

双指针(推荐)

class Solution {
public:
    bool oneEditAway(string first, string second) {
        int n = first.size();
        int m = second.size();
        int len = n-m;	
	    if (abs(len) > 1)
		    return false;
	    int count=1;
	    for (int i = 0,j=0; i < n &&j < m; i++,j++) 
        {
		    if (first[i]!=second[j]) {
		    	if (len==1) //second添加一个字符 
			    	j--;
                else if (len==-1) //second删除一个字符
		    		i--;
		    	count--;    //编辑second的字符
	    	}
	    	if (count<0)     //大于一次编辑就失败
		    	return false;
    	}
    	return true;   
    }
};

标签:字符,面试题,int,金典,好题,编辑,second,dp,first
来源: https://blog.csdn.net/weixin_46282078/article/details/122874191