编辑距离初印象

在计算机科学的奇妙世界里,编辑距离是一个非常有趣且实用的概念。它指的是将一个字符串通过插入、删除或替换字符等操作,变成另一个字符串所需的最少操作次数。而今天,我们要聚焦的是其中一种特殊情况 —— 相隔为 1 的编辑距离。想象一下,两个字符串看似相近,只需一次小小的改动就能相互转换,是不是很神奇呢?让我们一起深入探索这个神秘的 “编辑距离为 1” 的世界吧!
核心概念详解

在了解相隔为 1 的编辑距离之前,我们先来回顾下编辑距离的定义,它指的是将一个字符串通过插入、删除或替换字符等操作,变成另一个字符串所需的最少操作次数。而今天聚焦的相隔为 1 的编辑距离,就是说只需要进行一次上述操作就能让两个字符串相互转换哦。
满足编辑距离等于 1 有三种可能的情形,下面咱们通过具体示例来详细说说。
插入操作:
比如有两个字符串 “ab” 与 “acb”,对于字符串 “ab”,我们可以通过插入一个字符‘c’,就得到了字符串 “acb”,这种情况下它们的编辑距离就是 1 啦,也就是满足相隔为 1 的编辑距离这一情况哦。
删除操作:
举个反例便于大家更好理解呀,如果有两个字符串 “cab” 与 “ad”,咱们试着分析下,会发现无论怎么删除 “cab” 中的一个字符,都没办法一步就变成 “ad”,所以这两个字符串的编辑距离可不是 1 哦,不符合相隔为 1 的编辑距离要求呢。
替换操作:
再看 “1203” 与 “1213” 这两个字符串,我们可以将字符串 “1203” 中的‘0’替换为‘1’,这样就得到了 “1213”,刚好是通过一次替换操作完成的转换,那它们之间的编辑距离就是 1,属于相隔为 1 的编辑距离范畴哦。
总的来说,判断两个字符串是否为相隔为 1 的编辑距离,可以先比较它们的长度,如果长度一样,那就看是不是仅仅有一个位置的字符不同(这种情况通过替换操作即可实现编辑距离为 1);要是长度不一样,且相差为 1,那就需要满足当对应位置字符不同时,s [i]==t [i + 1] 或者 s [i + 1]==t [i](这种情况通过插入或者删除操作即可实现编辑距离为 1),这里要注意哦,判断的时候要留意越界的情况呀。只有符合上述这些规则的两个字符串,它们之间的编辑距离才是 1 呢,也就是我们所说的相隔为 1 的编辑距离情况啦。
算法实现大揭秘

逐字符比较法
在判断两个字符串是否为相隔为 1 的编辑距离时,逐字符比较法是一种较为直观且高效的方法哦。下面咱们来详细说说它的实现步骤。
首先,要比较两个字符串的长度呀。因为长度的差异会提示我们可能需要进行的编辑操作类型呢。如果两个字符串长度相同,那就意味着要是它们的编辑距离为 1 的话,大概率是通过一次替换操作来实现的哦。这个时候呀,我们就可以逐个字符去比较这两个字符串啦,一旦发现有一处字符不一样,那就检查从这个不一样字符的下一位开始往后的子串是否完全一样哦。要是完全一样,那就说明通过这一次替换操作就能让两个字符串相互转换啦,编辑距离就是 1 哦。
举个例子来说吧,比如有两个字符串 “abc” 和 “adc”,我们先比较长度,都是 3,一样长呢。然后逐个字符比较,发现第二个字符不一样,‘b’和‘d’嘛,接着再看后面的子串,从第三个字符开始往后,都是‘c’呀,所以这两个字符串就是通过一次替换操作(把‘b’换成‘d’)就能实现转换啦,编辑距离为 1 哦。
而要是两个字符串长度相差为 1 呢,那就可能是通过一次插入或者删除操作来达成编辑距离为 1 的情况啦。同样也是逐个字符去比较哦,当发现对应位置字符不同的时候,要看看是不是满足当对应位置字符不同时,s [i]==t [i + 1] 或者 s [i + 1]==t [i] 这个条件哦(这里要留意别越界啦),要是满足,那就说明可以通过在较短字符串对应位置插入字符或者从较长字符串对应位置删除字符的操作,让两个字符串相互转换,编辑距离就是 1 呢。
给大家附上一段简单的 Python 代码示例来帮助理解呀:
我们来分析一下逐字符比较法的时间复杂度和空间复杂度哦。时间复杂度呢,是 O (n),这里的 n 指的是较短字符串的长度呀,因为在最坏的情况下,我们需要遍历较短字符串的每一个字符呢。而空间复杂度是 O (1) 哦,因为整个过程只是用了常数空间来存储像计数变量、索引这些东西呀,并没有占用额外太多的空间呢。
动态规划法(选讲)
动态规划法也是解决编辑距离相关问题的一种常用思路哦,不过在相隔为 1 的编辑距离这个具体问题里呀,它可能不是最优解法,但了解一下它的思路和过程,对我们拓展算法思维还是很有帮助的呢。
那它是怎么操作的呢?首先呀,要构建一个二维数组 dp,这里面的 dp [i][j] 表示的是字符串 s 从开头到第 i 个字符组成的子串和字符串 t 从开头到第 j 个字符组成的子串之间的编辑距离哦。
接着就是初始化啦,当其中一个字符串为空串的时候,编辑距离就是另一个字符串的长度呀。比如 dp [i][0](也就是 t 为空串时)就赋值为 i,dp [0][j](也就是 s 为空串时)就赋值为 j 哦。
然后就是填充这个二维数组 dp 的过程啦,这一步要根据不同的编辑操作(插入、删除、替换)来更新 dp 的值哦。如果 s [i - 1]==t [j - 1],那就说明当前这两个字符是一样的呀,那 dp [i][j] 就等于 dp [i - 1][j - 1],也就是不用进行额外操作啦,跟前一步的编辑距离是一样的哦。但要是 s [i - 1]!=t [j - 1] 呢,那就需要考虑三种操作啦,分别是插入、删除、替换,取这三种操作对应情况里编辑距离最小的那个值再加 1 来更新 dp [i][j] 哦,也就是 dp [i][j]=1 + min (dp [i - 1][j], dp [i][j - 1], dp [i - 1][j - 1]) 。
最后呀,就是判断啦,我们去检查 dp 数组最后一行和最后一列的值,如果这个值是 1,那就说明这两个原始字符串之间的编辑距离是 1 哦。
下面也给大家一段 Python 代码示例来看看具体实现呀:
def isOneEditDistanceDP(s, t):
m, n = len(s), len(t)
if abs(m - n) > 1:
return False
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m + 1):
for j in range(n + 1):
if i == 0:
dp[i][j] = j
elif j == 0:
dp[i][j] = i
elif s[i - 1] == t[j - 1]:
dp[i][j] = dp[i - 1][j - 1]
else:
dp[i][j] = 1 + min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1])
return dp[m][n] == 1
对比一下动态规划法和逐字符比较法的复杂度情况呀。动态规划法的时间复杂度是 O (m * n),这里的 m 和 n 分别是字符串 s 和 t 的长度哦,因为要填充整个二维数组呀,计算量相对大一些呢。空间复杂度同样也是 O (m * n),毕竟创建了这么大的一个二维数组来存储中间结果呀。所以在这个相隔为 1 的编辑距离问题里呀,逐字符比较法相对来说在时间和空间上会更有优势一些哦,但动态规划法在处理更复杂、编辑操作次数更多的情况时,可就发挥大作用啦。
应用场景大赏

拼写检查
在我们日常使用的各种文本编辑软件中,拼写检查功能可是非常常见且实用的哦。它的背后就有着相隔为 1 的编辑距离算法的身影呢。当我们不小心输入了一个拼写错误的单词时,软件会快速地在词典中查找那些与错误单词编辑距离为 1 的单词,比如将 “hte” 通过插入一个字母‘r’变成 “ther”,或者将 “form” 中的‘o’替换为‘u’得到 “from” 等情况,然后根据一定的语言模型和词频统计等信息,给出最有可能的正确拼写建议,帮助我们快速纠正拼写错误,是不是很贴心呢?
模糊搜索
像我们在使用搜索引擎或者数据库查询时,有时候记不太清楚准确的关键词,只记得大概的样子。这时候,模糊搜索就派上用场啦!它能够允许我们输入与目标词稍有差异的关键词,然后通过计算编辑距离,找到那些与输入词相隔为 1 的相关结果。比如说,我们搜索 “appel”,它可能会找到 “apple”“appeal” 等编辑距离为 1 的词汇,从而拓宽搜索范围,提高我们找到所需信息的概率,让搜索变得更加智能和便捷。
DNA 序列分析
在生物信息学领域,科学家们经常需要对 DNA 序列进行分析和比较。由于 DNA 序列可能会因为基因突变等原因产生微小的差异,相隔为 1 的编辑距离算法就可以用来快速识别这些差异哦。例如,一条正常的 DNA 序列 “ATCGGTA” 和一条发生了单碱基突变的序列 “ATCAGTA”,通过编辑距离的计算,就能快速发现它们之间的差异,这对于研究遗传疾病、物种进化等方面有着重要的意义,帮助科学家们更深入地了解生命的奥秘。
抄袭侦测
在学术和文学创作等领域,确保作品的原创性至关重要。抄袭侦测工具可以利用编辑距离算法来比较不同文本之间的相似度。如果两篇文章中存在大量段落或者句子之间的编辑距离为 1,比如只是简单地替换了几个词语或者插入、删除了少量字词,那就很有可能存在抄袭嫌疑哦。通过这种方式,能够有效地维护学术诚信和创作的公正性,保护原创作者的权益。
语音识别
当我们使用语音助手或者语音输入软件时,语音识别技术会将我们说的话转换成文字。由于不同人的发音习惯、口音以及语音信号传输过程中可能存在的噪声等因素影响,识别结果可能会出现一些偏差。这时,相隔为 1 的编辑距离算法可以用来对识别结果进行纠错和优化。例如,将 “我要去北京” 误识别为 “我要去北金”,通过编辑距离计算,发现将‘金’替换为‘京’即可得到正确的结果,从而提高语音识别的准确率,让人与机器的交互更加顺畅。
数据匹配与整合
在处理大量的数据时,经常需要对不同数据源中的数据进行匹配和整合。例如,在客户信息管理系统中,可能存在来自不同渠道的客户数据,由于录入错误或者格式差异等原因,同一个客户的信息可能会稍有不同。通过编辑距离算法,可以快速找出那些可能是重复但存在微小差异的记录,比如姓名中某个字的拼写错误、地址中少写了一个数字等情况,将其进行合并和整理,保证数据的一致性和准确性,为后续的数据分析和决策提供可靠的基础。
自然语言处理
在自然语言处理的众多任务中,如机器翻译、文本摘要、问答系统等,都离不开对文本的理解和处理。相隔为 1 的编辑距离算法可以用于文本的预处理和后处理阶段。比如在机器翻译中,对于翻译后的文本,可以通过编辑距离与原文进行对比,检查是否存在由于翻译错误导致的词汇或短语的编辑距离为 1 的情况,从而对翻译结果进行优化和修正;在文本摘要生成后,也可以通过与原文的编辑距离计算,评估摘要的准确性和完整性,确保关键信息没有丢失或被错误地修改。
推荐系统
推荐系统旨在为用户提供个性化的推荐内容,例如电商平台推荐商品、音乐平台推荐歌曲、视频平台推荐视频等。编辑距离算法可以用来分析用户的历史行为数据和偏好信息。比如,如果用户经常浏览或购买某类商品,系统可以通过编辑距离找到与这些商品名称或描述编辑距离为 1 的其他相关商品,然后将其推荐给用户,从而提高推荐的精准度和用户的满意度,让用户更容易发现自己感兴趣的内容。
文本分类与聚类
在对大量文本进行分类和聚类时,编辑距离可以作为一种衡量文本相似度的指标。对于一些相似的文本,它们之间的编辑距离可能较小。例如,在新闻分类中,关于同一事件的不同报道可能会因为记者的用词习惯、报道角度等因素而存在一些细微差别,但整体内容是相似的。通过计算编辑距离,将编辑距离为 1 或相近的文本归为一类,有助于更准确地对文本进行分类和组织,提高信息管理和检索的效率。
错误侦测与纠正
在数据录入、文本传输等过程中,难免会出现一些错误。编辑距离算法可以用于自动侦测这些错误,并尝试进行纠正。例如,在银行转账信息录入时,如果账号或金额等关键信息出现了一个字符的错误,通过与正确格式或历史记录的编辑距离比较,能够及时发现并提示用户进行更正,避免因错误信息导致的不必要的损失和麻烦,保障数据的准确性和交易的安全性。
实战演练时刻

嘿,亲爱的读者朋友们,前面咱们已经详细了解了相隔为 1 的编辑距离的相关概念、算法实现等内容啦,现在到了实战演练时刻哦!下面我来给出几个简单的字符串示例,大家可以试着运用刚刚学到的知识,来判断一下它们之间的编辑距离是否为 1 呀,快来一起试试吧。
示例一:有字符串 “book” 和 “brook” 哦,大家先观察下这两个字符串的长度呀,“book” 长度是 4,“brook” 长度是 5,长度相差了 1 呢。那咱们就按照之前讲的思路来分析哦,逐个字符比较的时候,会发现前面 3 个字符都是一样的,到了第 4 个字符出现不同啦,这个时候呢,对于较短的字符串 “book”,是不是可以通过在对应位置插入‘r’这个字符,就变成 “brook” 啦,刚好满足咱们说的通过一次插入操作就能转换的情况呀,所以它们之间的编辑距离就是 1 哦,属于相隔为 1 的编辑距离呢,大家判断对了没呀?
示例二:再看 “sun” 和 “son” 这两个字符串哦,它们长度是一样的呢,都是 3 哦。接着咱们逐个字符比较,会发现第一个字符相同,都是‘s’,但是第二个字符不一样啦,‘u’和‘o’嘛。然后再往后看剩余的子串呀,从第三个字符开始往后就没有啦,那这里就是通过一次替换操作(把‘u’替换成‘o’)就能让 “sun” 变成 “son” 哦,所以这两个字符串的编辑距离也是 1 哦,同样符合相隔为 1 的编辑距离的要求呀,大家跟上思路了不呀?
示例三:咱们再来看一组字符串 “play” 和 “plsy” 哦,同样先比较长度,都是 4,一样长哦。然后逐个字符去核对,会发现第三个字符不一样,‘a’和‘s’呀,再往后看剩余子串,从第四个字符开始往后都是‘y’哦,所以这也是通过一次替换操作(把‘a’换成‘s’)就可以实现相互转换啦,它们之间的编辑距离就是 1 哦,也是咱们所说的相隔为 1 的编辑距离情况呢。
怎么样呀,朋友们,通过这几个小例子的练习,是不是对相隔为 1 的编辑距离的判断更加熟悉了呢?大家要是还有兴趣呀,可以自己再找几组字符串来试着判断判断哦,相信通过这样的实践练习,以后遇到类似的问题就能轻松应对啦!
总结与展望

至此,我们已经深入探索了相隔为 1 的编辑距离这一有趣的概念,从其核心定义、算法实现,到丰富多样的应用场景,再到实战演练,相信大家都已经对它有了较为全面的了解。编辑距离的研究远不止于此,在实际应用中,为了应对大规模数据和复杂的文本处理需求,研究者们还在不断探索更加高效、准确的算法改进策略。例如,结合机器学习和深度学习技术,让编辑距离的计算能够自动适应不同领域的文本特点,进一步提高拼写检查、抄袭侦测等任务的准确率;或者通过优化数据结构和算法流程,降低计算复杂度,以处理更长、更复杂的字符串序列。
在未来,随着人工智能、大数据等技术的不断发展,编辑距离及其相关算法将在更多领域展现其价值,为解决实际问题提供有力的支持。希望大家能够继续保持对知识的渴望和探索精神,深入挖掘编辑距离背后的更多奥秘,将其巧妙地应用到实际工作和学习中,创造出更多有趣且实用的成果!如果你在学习和实践过程中有任何新的发现或疑问,欢迎随时回来查阅本文,或者与我们分享你的经验和见解,让我们一起在知识的海洋中不断前行!
更多信息关注公众号
字符串的左右移
https://mp.weixin.qq.com/s/aXtW3ieNQCenokukMVUGvA?token=2127694065&lang=zh_CN

612

被折叠的 条评论
为什么被折叠?



