ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-02-11 10:01:03  阅读:200  来源: 互联网

标签:字符 面试题 int 金典 好题 编辑 second dp first


面试题 01.05. 一次编辑

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

示例 1:

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

示例 2:

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

解题方法:

动态规划法:

  • 找出最小编辑次数(dp[i][j]的含义)
  • 初始化(一边的字符串为空):
    • dp[0][j] = j;
    • dp[0][i] = i;
  • 动态转化方程
    • 如果当前字符相等,就等于前一个字符的编辑次数(次数不变)
    • 如果不相等,就等于前一个字符的最小编辑次数 + 1
  • 时间复杂度O(nm)
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; 
    }
};

双指针(推荐)

  • 判断字符串长度
    • 如果大于1就说明无法一次编辑实现
    • 如果等于1,说明第一个比第二个长,在second上需要加一个字符(加减是一样的)
    • 如果小于1,说明第一个比第二个断,在second上需要减一个字符
    • 如果等于0,说明需要改变second上的字符.
  • 同时遍历两个字符串,如果不同就根据情况编辑,记录编辑次数.如果大于1就返回false;
  • 时间复杂度O(max(n,m))
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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有