mysql 编辑距离 搜索_最短编辑距离

分析

2b6309e4d9430665ddedd8e6b4ed34a4.png

根据最长公共子序列中状态表示的技巧,本题依旧两个串。状态标识设 dp[i,j] 表示将a[1-i] 变为 b[1-j] 的所有操作方式的集合中最少操作次数。

其实做了几道线性dp的题目,发现还是有些技巧:就是大都根据最后一个状态或者最后一个或一对元素考虑

递推公式的推导:考虑元素a[i] 和 b[j]的三种操作

1. 通过删除a[i] 使得 a[1-i] 变为 b[1-j],意味着a[1-i-1]与b[1-j]已经匹配 。

dp[i,j] = dp[i-1,j]  + 1

2. 通过对a数组增加元素使得  a[1-i+1] 变为 b[1-j],意味着a[1-i]与b[1-j-1]已经匹配

dp[i,j] = dp[i,j-1]  + 1

3.通过修改a[i]使得  a[1-i] 变为 b[1-j],意味着[1-i-1]与b[1-j-1]已经匹配

dp[i,j] = dp[i,j-1]  + (1/0)       若a[i] == b[j] 则不用加1,若不等则需要改a[i],加1

最终 dp[i][j] = min(dp[i-1,j]  + 1, dp[i,j-1]  + 1,dp[i,j-1]  + (1/0)

代码

1 #include

2 #include

3 #include

4 using namespacestd;5

6 const int N = 1010;7 chara[N],b[N];8 intdp[N][N];9 intmain(){10 intn,m;11 scanf("%d%s",&n,a+1);12 scanf("%d%s",&m,b+1);13 //边界初始化14 //若a数组0个元素,则a只能添加操作

15 for(int i = 0;i <= m;i++) dp[0][i] =i;16 //若b数组0个元素,则a只能删除操作

17 for(int i = 0;i <= n;i++) dp[i][0] =i;18

19 for(int i = 1;i <= n;i++){20 for(int j = 1;j <= m;j++){21 dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + 1;22 if(a[i] ==b[j]){23 dp[i][j] = min(dp[i][j],dp[i-1][j-1]);24 }25 else{26 dp[i][j] = min(dp[i][j],dp[i-1][j-1]+1);27 }28

29 }30 }31 printf("%d",dp[n][m]);32 return 0;33 }

注意边界条件!!!第0行或第0列并不一定全为0!!!

时间复杂度O(N2)

MySQL并没有直接提供计算最短编辑距离的函数或方法。最短编辑距离是一个用于度量两个字符串之间相似度的概念,常用于文本相似度匹配、拼写纠错等场景。 如果你想在MySQL中计算最短编辑距离,可以考虑通过自定义函数来实现。一种较常见的实现方式是使用Levenshtein距离算法,该算法衡量了两个字符串之间的编辑操作次数(插入、删除和替换)。 在MySQL中,你可以编写自定义函数来计算Levenshtein距离。以下是一个示例自定义函数的代码: ```sql DELIMITER // CREATE FUNCTION LEVENSHTEIN(s1 VARCHAR(255), s2 VARCHAR(255)) RETURNS INT BEGIN DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT; DECLARE s1_char CHAR; DECLARE cv0, cv1 VARBINARY(256); SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0; IF s1 = s2 THEN RETURN 0; ELSEIF s1_len = 0 THEN RETURN s2_len; ELSEIF s2_len = 0 THEN RETURN s1_len; ELSE WHILE j <= s2_len DO SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1; END WHILE; WHILE i <= s1_len DO SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1; WHILE j <= s2_len DO SET c = c + 1; IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF; SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost; IF c > c_temp THEN SET c = c_temp; END IF; SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)),16, 10) + 1; IF c > c_temp THEN SET c = c_temp; END IF; SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1; END WHILE; SET cv1 = cv0, i = i + 1; END WHILE; END IF; RETURN c; END // DELIMITER ; ``` 使用该自定义函数可以计算两个字符串之间的最短编辑距离。例如: ```sql SELECT LEVENSHTEIN('kitten', 'sitting'); -- 返回结果为 3 ``` 请注意,这只是一种示例实现方式,你也可以根据自己的需要进行调整或优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值