面试题 01.05:一次编辑

简介: 面试题 01.05:一次编辑

题目

题目链接

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

示例 1:

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

示例 2:

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

解题

方法一:(动态规划)使用编辑距离

使用leetcode-72:编辑距离来做本题

判断编辑距离<=1即可。

但显然,这不是最优解,这道题没有那么复杂。

class Solution {
public:
    bool oneEditAway(string first, string second) {
        int m=first.size();
        int n=second.size();
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        for(int i=0;i<=m;i++) dp[i][0]=i;
        for(int j=0;j<=n;j++) dp[0][j]=j;
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(first[i-1]==second[j-1]){
                    dp[i][j]=dp[i-1][j-1];
                }
                else{
                    dp[i][j]=min({dp[i][j-1],dp[i-1][j],dp[i-1][j-1]})+1;
                }
            }
        }
        return dp[m][n]<=1;
    }
};

方法二:双指针

参考链接

class Solution {
public:
    bool oneEditAway(string first, string second) {
        int lf=first.size();//length first
        int ls=second.size();//length second
        if(lf>ls){
            return oneEditAway(second,first);//通过这一步保证,second长度大于first
        }
        if(ls-lf>1) return false;
        else if(ls==lf){
            int count=0;
            for(int i=0;i<ls;i++){
                if(first[i]!=second[i]) count++;
            }
            return count<=1;
        }
        else if(ls-lf==1){
            int i=0,j=0;
            while(i<lf){
                if(first[i]!=second[j]){
                    j++;
                    if(j-i>1) return false;
                }
                else{
                    i++;
                    j++;
                }
            }
        }
        return true;
    }
};


相关文章
|
7月前
|
Go
golang力扣leetcode 面试题01.05.一次编辑
golang力扣leetcode 面试题01.05.一次编辑
59 0
LeetCode——面试题 01.05. 一次编辑
LeetCode——面试题 01.05. 一次编辑
61 0
|
算法 C++ Python
前缀和+后缀和算法模板-附LeetCode习题-面试题 01.05. 一次编辑
前缀和+后缀和算法模板-附LeetCode习题-面试题 01.05. 一次编辑
LeetCode每日一题——面试题 01.05. 一次编辑
字符串有三种编辑操作:插入一个字符、删除一个字符或者替换一个字符。 给定两个字符串,编写一个函数判定它们是否只需要一次(或者零次)编辑。
82 0
|
关系型数据库 MySQL 测试技术
软件测试mysql面试题:编辑start.sh文件,查看文件前10行内容和后10行内容
软件测试mysql面试题:编辑start.sh文件,查看文件前10行内容和后10行内容
123 0
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
28天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
52 4
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
85 2
|
2月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
32 0