首页 > 编程语言 >算法题总结-字符串编辑距离

算法题总结-字符串编辑距离

时间:2023-06-20 11:14:53浏览次数:43  
标签:总结 字符 count len 算法 字符串 string2 string1

原题
https://www.nowcoder.com/practice/3959837097c7413a961a135d7104c314?tpId=37&tqId=21275&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fdifficulty%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tpId%3D37%26type%3D37&difficulty=3&judgeStatus=undefined&tags=&title=
Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家 Levenshtein 提出的,故又叫 Levenshtein Distance 。
例如:
字符串A: abcdefg
字符串B: abcdef
通过增加或是删掉字符 ”g” 的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。
要求:
给定任意两个字符串,写出一个算法计算它们的编辑距离。
数据范围:给定的字符串长度满足 \1≤len(str)≤1000
输入示例:

abcdefg
abcdef

输出示例:

1

基本解析过程:

每种情况分以下四种情况之一[相当于动态规划表中上、左、左上三个方向的对应变化]
1、比较字符串少一个字符 改变至相同字符 可以认为是当前字符串改变 提前删除一个字符 多一个操作
2、相同比较字符串 改变至模板少一个字符串 可以认为是当前改变 之后额外增加一个字符
3、比较字符串与模板 同时增加了一个字符 但是不相同
4、比较字符串与模板 同时增加了一个字符 且相同 此时 F[i,j] = F[i-1,j-1]

核心转移方程

F[i,j] = min(F[i-1,j]+1,F[i,j-1]+1,F[i-1,j-1]+1)

源码:

import sys
count=0
string1 = ""
string2 = ""

for line in sys.stdin:
    a = line.split()
    if count==0:
        string1 = a[0]
    elif count==1:
        string2 = a[0]
    else:
        break
    count+=1
template = string1 if len(string1)>len(string2) else string2
compareStr = string1 if len(string1)<=len(string2) else string2

templateList = [item for item in template]
compareList = [item for item in compareStr]

# 动态规划表
dictionary = [[0 for j in range(len(compareList)+1)] for i in range(len(templateList)+1)]
for i in range(1,len(templateList)+1):
    dictionary[i][0] = i
    pass
for j in range(1,len(compareList)+1):
    dictionary[0][j] = j
    pass
for i in range(1,len(templateList)+1):
    for j in range(1,len(compareList)+1):
        if templateList[i-1]==compareList[j-1]:
            dictionary[i][j] = dictionary[i-1][j-1]
            pass
        else:
            dictionary[i][j] = min(dictionary[i-1][j]+1,dictionary[i][j-1]+1,dictionary[i-1][j-1]+1)
            pass
        pass
    pass
print(dictionary[-1][-1])

标签:总结,字符,count,len,算法,字符串,string2,string1
From: https://www.cnblogs.com/dengliang356a/p/17493044.html

相关文章

  • Python中的字符串分割技巧:split方法的妙用
    Python是一种广泛使用的编程语言,提供了许多强大的字符串处理功能。其中,split方法是一项常用的技术,它可以将字符串按照指定的分隔符进行切割,使得处理文本数据变得更加简洁和高效。本文将介绍split方法的使用方法和几个实用的应用场景,帮助读者更好地掌握这一技巧。split方法的基本......
  • 原地算法
    在只使用O(1)的的额外空间的情况下在原地修改输入数组.例如:给定nums=[0,0,1,1,1,2,2,3,3,4],删去重复的元素,返回长度为5,元素为[0,1,2,3,4];函数代码实现为:intremoveDuplicates(int*nums,intnumsSize)//原地算法{inti;if(nums==NULL||numsSize==0)retur......
  • Python学习总结之三(if语句)
    1.其实Python和C语言中的if语句是极相似的,因为if语句的职能便是判断,区别如下:(1).Python(无括号,有冒号且缩进):ifcar=='byd':print(car.upper())(2).C(有括号,无冒号且缩进无意义):if(car=="byd")printf("%s",car);2.检查是否不相等:将“==”换为"!="即可。3.比较数字......
  • 代码随想录算法训练营第十二天| 递归遍历 (必须掌握)迭代遍历 统一迭代
    递归遍历重点:1,TreeNode的自定义2,val=0== val=NULL;代码:1voidpreRecursor(TreeNode*root,vector<int>&result)2{3if(root==NULL)4return;5result.push_back(root->val);6preRecursor(root->left,result);7......
  • 从零开始学Python第11课:常用数据结构之字符串
    第二次世界大战促使了现代电子计算机的诞生,世界上的第一台通用电子计算机名叫ENIAC(电子数值积分计算机),诞生于美国的宾夕法尼亚大学,占地167平米,重量约27吨,每秒钟大约能够完成约5000次浮点运算,如下图所示。ENIAC诞生之后被应用于导弹弹道的计算,而数值计算也是现代电子计算机最为重......
  • IO流总结
    1.字节流字节输入流:InputStream(FileInputStream,BufferedInputStream)两种数读取方式:intread();一次读取一个字节,返回值是int,为-1时内容为空intread(byte[]bys);一次读取一个字节数组,返回值是int,为-1时内容为空字节输出流:Outp......
  • Python开发系列课程(8) - 字符串和常用数据结构
    字符串和常用数据结构使用字符串第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代,计算机处理的信息主要是数值,而世界上的第一台电子计算机ENIAC每秒钟能够完成约5000次浮点运算。随着时间的推移,虽然对数值运......
  • 总结C++中#include<>和#include""的区别
    查找目录不同1、#include<>编译器直接从系统类库目录里查找头文件比如在vs中,使用#include<>编译器会直接在vs安装目录下在编译器自带的库文件中进行搜索。如果类库目录下查找失败,编译器会终止查找,直接报错:Nosuchfileordirectory.如果我们自定义一个头文件"aaa.h",将其放在......
  • 格式化字符串
    介绍格式化字符串格式化字符串函数可以接受可变数量的参数,并将第一个参数作为格式化字符串,根据其来解析之后的参数。通俗来说,格式化字符串函数就是将计算机内存中表示的数据转化为我们人类可读的字符串格式。几乎所有的C/C++程序都会利用格式化字符串函数来输出信息,调试程序,或......
  • 1.redis常见数据类型-字符串String、列表List、集合Set、Hash哈希、Zset有序集合
    背景:这里说的数据类型是value的数据类型,key的类型都是字符串。命令不区分大小写,而key的值是区分大小写的 help@+数据类型会出现命令提示比如help@string,help@list常见命令:keys*查看当前库所有key(匹配:keys*1)existskey判断某个key是否存在typekey查看你的......