IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 面试题01.05. 一次编辑 -> 正文阅读

[C++知识库]面试题01.05. 一次编辑

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

示例1:

输入:

first = "pale"

second = "ple"

输出:True

示例2:

输入:

first = "pales"

second = "pal"

输出:False

?1. 思考

先分析允许进行的操作:

1. 插入一个字符:当两个字符串长度只相差1的时候可能满足,稍短的字符串将某个字符往后的字符数组平移一位后,剩余字符与稍长的字符串一致。

2. 删除一个字符:两个字符串长度只相差1的时候可能满足,同时删除一个字符可以看作是插入一个字符的相反操作。即删除一个字符是指稍长字符串删除一个字符得到稍短字符串,也可以看作是稍短字符串插入一个字符得到稍长字符串。

3. 替换一个字符:两个字符串长度相同时可能满足,两个字符串只有唯一一个索引位的字符不一致。

在了解所有一次编辑操作场景的本质后,我们就可以根据两个字符串长度间的关系,分别判断是否满足对应场景条件,比如两个字符串first和second。

1. len(first) == len(second)

?判断first和second是否只有0个或者1个索引位的字符不相同。

2. len(first) + 1 == len(second)

first字符串的长度比second少1,判断是否first添加一个字符就可以与second一致。

3. len(first) == len(second) + 1

first字符串的长度比second多1,判断是否second添加一个字符就可以与first一致。

4. 其他情况不可能仅一次编辑使first与second一致

其中场景1中判断first和second是否仅有不超过1个索引位的字符不相同很简单,遍历字符串,记录不相同的字符总数即可。

场景2和场景3中判断first是否插入一个字符就可以和second一致,观察上图可以发现,如果first与second存在首个索引位不一致后,当前first索引位字符直接与second的后一个索引位字符比较,如果后续字符都一致,说明满足first插入一个字符就与second一致的可能。

假定len(first) + 1 == len(second),实现代码如下:

// first是否可以插入一个字符和second一致
public boolean oneInsert(String first, String second) {
    // index1记录当前判断的first索引位
    int index1 = 0;
    // index2记录当前判断的second索引位
    int index2 = 0;
    // 遍历所有字符
    while (index1 < first.length() && index2 < second.length()) {
        if (first.charAt(index1) == second.charAt(index2)) {
            // 当两个字符索引位字符一致时,后移索引
            index1++;
            index2++;
        }
        else {
            // 当两个字符索引位字符不一致时,先判断是否是第一次不一致
            // 如果不是第一次不一致说明second后移一位后仍有不一致字符
            // 即无法将first插入一个字符与second一致
            if (index1 != index2) {
                return false;
            }
            // 第一次不一致,second索引后移一位
            index2++;
        }
    }
    return true;
}

?2. 代码实现

根据上面分析思路,代码实现如下:

public boolean oneEditAway(String first, String second) {
    if (first == null || second == null) {
        return false;
    }
    if (first.length() == second.length()) {
        // 字符数相同,需要考虑相等(零次编辑)和一次修改字符两种场景
        if (oneReplace(first, second)) {
            return true;
        }
    }
    else if (first.length() + 1 == second.length()) {
        // first字符个数比second少一个,考虑first添加一个字符和second一致
        if (oneInsert(first, second)) {
            return true;
        }
    }
    else if (first.length() == second.length() + 1) {
        // first字符个数比second多一个,考虑second添加一个字符和first一致
        if (oneInsert(second, first)) {
            return true;
        }
    }
    // 其他情况不可能一次编辑让first和second一致
    return false;
}
// first和second是否只有不超过1个字符不同
private boolean oneReplace(String first, String second) {
    int diffNum = 0;
    for (int i = 0; i < first.length(); i++) {
        if (first.charAt(i) != second.charAt(i)) {
            diffNum++;
        }
    }
    return diffNum <= 1;
}
// first添加一个字符与second一致
private boolean oneInsert(String first, String second) {
    int index1 = 0;
    int index2 = 0;
    while (index1 < first.length() && index2 < second.length()) {
        if (first.charAt(index1) == second.charAt(index2)) {
            index1++;
            index2++;
        }
        else {
            if (index1 != index2) {
                return false;
            }
            index2++;
        }
    }
    return true;
}

?

?

?

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-16 19:28:07  更:2021-10-16 19:29:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:00:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码