第3章 结构之法——计算字符串的相似度

计算字符串的相似度

问题描述

分析与解法

具体代码如下:

 1 package chapter3jiegouzhifa.StringSimilarity;
 2 /**
 3  * 计算字符串的相似度
 4  * 【解法一】
 5  * @author DELL
 6  *
 7  */
 8 public class StringSimilarity {
 9     public static int CalculateStringDistance(String str1, int b1, int e1, String str2, int b2, int e2){
10         if(b1>e1){
11             if(b2>e2)
12                 return 0;
13             else
14                 return e2-b2+1;
15         }
16         if(b2>e2){
17             if(b1>e1)
18                 return 0;
19             else
20                 return e1-b1+1;
21         }
22         if(str1.charAt(b1)==str2.charAt(b2)){
23             return CalculateStringDistance(str1,b1+1,e1,str2,b2+1,e2);
24         }else{
25             int t1 = CalculateStringDistance(str1,b1+1,e1,str2,b2,e2);
26             int t2 = CalculateStringDistance(str1,b1,e1,str2,b2+1,e2);
27             int t3 = CalculateStringDistance(str1,b1+1,e1,str2,b2+1,e2);
28             return Math.min(Math.min(t1, t2), t3)+1;
29         }
30     }
31     public static void main(String[] args) {
32         String s1 = "xabcdae";
33         String s2 = "xfdfa";
34         System.out.println(s1+"与"+s2+"的距离为:"+CalculateStringDistance(s1,0,s1.length()-1,s2,0,s2.length()-1));
35
36     }
37
38 }

程序运行结果如下:

xabcdae与xfdfa的距离为:5

下述代码清单3-6有误,最后的t1,t2,t3计算错误。

改进后的程序如下:

 1 package chapter3jiegouzhifa.StringSimilarity;
 2 /**
 3  * 计算字符串的相似度
 4  * 【解法二】改进算法
 5  * 用空间换时间
 6  * @author DELL
 7  *
 8  */
 9 public class StringSimilarity2 {
10     public static int CalculateStringDistance(String str1, int b1, int e1, String str2, int b2, int e2){
11         int s[][][][] = new int[str1.length()+1][str1.length()][str2.length()+1][str2.length()];
12         if(b1>e1){
13             if(b2>e2)
14                 return 0;
15             else
16                 return e2-b2+1;
17         }
18         if(b2>e2){
19             if(b1>e1)
20                 return 0;
21             else
22                 return e1-b1+1;
23         }
24         if(s[b1][e1][b2][e2]!=0)
25             return s[b1][e1][b2][e2];
26         else{
27             if(str1.charAt(b1)==str2.charAt(b2)){
28                 s[b1][e1][b2][e2]=CalculateStringDistance(str1,b1+1,e1,str2,b2+1,e2);
29                 return s[b1][e1][b2][e2];
30             }else{
31                 int t1,t2,t3;
32                 if(s[b1+1][e1][b2][e2]!=0)
33                     t1 = s[b1+1][e1][b2][e2];
34                 else{
35                     s[b1+1][e1][b2][e2] = CalculateStringDistance(str1,b1+1,e1,str2,b2,e2);
36                     t1 = s[b1+1][e1][b2][e2];
37                 }
38                 if(s[b1][e1][b2+1][e2]!=0)
39                     t2 = s[b1][e1][b2+1][e2];
40                 else{
41                     s[b1][e1][b2+1][e2] = CalculateStringDistance(str1,b1,e1,str2,b2+1,e2);
42                     t2 = s[b1][e1][b2+1][e2];
43                 }
44                 if(s[b1+1][e1][b2+1][e2]!=0)
45                     t3 = s[b1+1][e1][b2+1][e2];
46                 else{
47                     s[b1+1][e1][b2+1][e2] = CalculateStringDistance(str1,b1+1,e1,str2,b2+1,e2);
48                     t3 = s[b1+1][e1][b2+1][e2];
49                 }
50                 s[b1][e1][b2][e2] = Math.min(Math.min(t1, t2), t3)+1;
51                 return s[b1][e1][b2][e2];
52             }
53         }
54     }
55     public static void main(String[] args) {
56         String s1 = "xabcdae";
57         String s2 = "xfdfa";
58         System.out.println(s1+"与"+s2+"的距离为:"+CalculateStringDistance(s1,0,s1.length()-1,s2,0,s2.length()-1));
59
60     }
61
62 }

程序运行结果如下:

xabcdae与xfdfa的距离为:5
时间: 2024-07-30 10:23:50

第3章 结构之法——计算字符串的相似度的相关文章

计算字符串的相似度

计算字符串的相似度 提出问题 许多程序会大量使用字符串.对于不同的字符串,我们希望能够有办法判断其相似程度.我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把"a"替换为"b"). 2.增加一个字符(如把"abdd"变为"aebdd"). 3.删除一个字符(如把"travelling"变为"traveling"). 比如,对于"ab

[华为]计算字符串的相似度

链接:https://www.nowcoder.com/questionTerminal/f549ee08ddd84b8485a4fa9aefaf4a38来源:牛客网 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把"a"替换为"b". 2 增加一个字符,如把"abdd"变为"aebdd". 3 删除一个字符,如把"tr

华为机试-计算字符串的相似度

题目描述 对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下: 1 修改一个字符,如把"a"替换为"b". 2 增加一个字符,如把"abdd"变为"aebdd". 3 删除一个字符,如把"travelling"变为"traveling". 比如,对于"abcdefg"和"abcdef&qu

编程之美3.3—计算字符串的相似度

题目: 许多程序会大量使用字符串.对于不同的字符串,我们希望能够有办法判断其相似程序.我们定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为: 1.修改一个字符(如把"a"替换为"b"); 2.增加一个字符(如把"abdd"变为"aebdd"); 3.删除一个字符(如把"travelling"变为"traveling"); 比如,对于"abcdefg"和

第3章 结构之法——字符串移位包含的问题

字符串移位包含的问题 问题描述 分析与解法 [解法一] 具体代码如下: 1 package chapter3jiegouzhifa.QuestionOfStringMove; 2 /** 3 * 字符串移位包含的问题 4 * [解法一] 5 * @author DELL 6 * 7 */ 8 public class StringMove { 9 /** 10 * 寻找移位后的字串(左移) 11 * @param src 源字符串 12 * @param des 要查找的子串 13 * @ret

第三章结构之法--------字符串移位包含

字符串移位包含的问题 给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位(rotate)得到的字符串包含. 例如,给定s1=AABCD和s2=CDAA,s1可以通过向右移动两位,s1------>BCDAA,使得s1包含s2,返回true. 而对于s1=ABCD和s2=ACBD,无论s1怎么移动,都无法包含s2,则返回false. 分析与解法 解法1: 这一道题,一开始我并没有想到什么好的解题思路.首先想到的是用暴力枚举的方法,将所有移位后字符串都 列举出来,在进行判断.并且移动的次

程之美第3章结构之法-字符串及链表的探索3.7 队列中取最大值操作问题

#include<iostream> #include<vector> using namespace std; class stack { private: vector<int> vec;//用来保存当前进栈的值 vector<int> max_vec; public: void push(int a) { vec.push_back(a); if(max_vec.size()==0||a>vec[max_vec[max_vec.size()-1]

第3章 结构之法——重建二叉树

重建二叉树 问题描述 分析与解法 用java实现的代码如下: 1 package chapter3jiegouzhifa.RebuildBinTree; 2 3 /** 4 * 重建二叉树 5 * 递归解法 6 * @author DELL 7 * 8 */ 9 public class RebuildBinTree { 10 //定义节点类 11 public static class Node{ 12 int left; //左子树位置 13 int right; //右子树位置 14 ch

第3章 结构之法——电话号码对应英语单词

电话号码对应英语单词 问题描述 分析与解法 详细代码如下: 1 package chapter3jiegouzhifa.TelephoneMapWords; 2 /** 3 * 电话号码对应英语单词 4 * @author DELL 5 * 6 */ 7 public class TelephoneMapWords1 { 8 private int telLength; //电话号码的位数 9 private char c[][]={ //各个数字所能代表的字符 10 "".toCha