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

题目描述

对于不同的字符串,我们希望能有办法判断相似程度,我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法如下:

1 修改一个字符,如把“a”替换为“b”。

2 增加一个字符,如把“abdd”变为“aebdd”。

3 删除一个字符,如把“travelling”变为“traveling”。

比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加和减少一个“g”的方式来达到目的。上面的两种方案,都只需要一次操作。把这个操作所需要的次数定义为两个字符串的距离,而相似度等于“距离+1”的倒数。也就是说,“abcdefg”和“abcdef”的距离为1,相似度为1/2=0.5.

给定任意两个字符串,你是否能写出一个算法来计算出它们的相似度呢?

请实现如下接口

/* 功能:计算字符串的相似度
  * 输入:pucAExpression/ pucBExpression:字符串格式,如: "abcdef"
  * 返回:字符串的相似度,相似度等于“距离+1”的倒数,结果请用1/字符串的形式,如1/2
  */
 public static  String  calculateStringDistance(String expressionA, String expressionB)
 {
     /* 请实现*/
     return null;
 }

约束:

1、PucAExpression/ PucBExpression字符串中的有效字符包括26个小写字母。

2、PucAExpression/ PucBExpression算术表达式的有效性由调用者保证;
3、超过result范围导致信息无法正确表达的,返回null。

输入描述:

输入两个字符串

输出描述:

输出相似度,string类型

示例1

输入

abcdef
abcdefg

输出

1/2

java 程序实现:

  1. import java.util.Scanner;
  2. public class Main {
  3. public int fun(String source, String target) {
  4. int i, j;
  5. int[][] d = new int[source.length() + 1][target.length() + 1];
  6. for (i = 1; i < source.length() + 1; i++) {/* 初始化临界值 */
  7. d[i][0] = i;
  8. }
  9. for (j = 1; j < target.length() + 1; j++) {/* 初始化临界值 */
  10. d[0][j] = j;
  11. }
  12. for (i = 1; i < source.length() + 1; i++) {/* 动态规划填表 */
  13. for (j = 1; j < target.length() + 1; j++) {
  14. if (source.substring(i - 1, i).equals(target.substring(j - 1, j))) {
  15. d[i][j] = d[i - 1][j - 1];/* source的第i个和target的第j个相同时 */
  16. } else {/* 不同的时候则取三种操作最小的一个 */
  17. d[i][j] = min(d[i][j - 1] + 1, d[i - 1][j] + 1, d[i - 1][j - 1] + 1);
  18. }
  19. }
  20. }
  21. return d[source.length()][target.length()];
  22. }
  23. private int min(int i, int j, int k) {
  24. int min = i < j ? i : j;
  25. min = min < k ? min : k;
  26. return min;
  27. }
  28. public static void main(String[] args) {
  29. Main ss = new Main();
  30. Scanner scanner = new Scanner(System.in);
  31. while (scanner.hasNext()) {
  32. String string1 = scanner.nextLine();
  33. String string2 = scanner.nextLine();
  34. System.out.println("1/" + (ss.fun(string2, string1) + 1));
  35. }
  36. }
  37. }
时间: 2024-08-04 12:48:41

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

华为机试—计算麻将的番数(高级题160分)

一.题目如下 二.题目分析 麻将和牌有两种形式,即: 模式1 :11,11,11,11,11,11,11 模式2: 11,123,123,123,123(全部或者部分123可以被111,1111替代) 注:123=连续3张同花色牌,如4D5D6D.111=3张同样的牌,如3T3T3T. 条=T,筒=D 模式1即称之为"巧7对",一组牌刚好是7对牌.但是这里有一个疑问,"对"能否重复,即"杠"能否能当作2"对"(即题目中的&qu

华为机试测试- 字符串最长的数字串

输入 输入一个字符串. 输出 输出字符串中最长的数字字符串和它的长度. 如果数字字符串为空,则只输出0 如 input: dadfsaf  output:0 样例输入 abcd12345ed125ss123058789 样例输出 123058789,9 import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; public class Main { p

华为机试—替换字符串中的字母

功能描述:将字符串中的字母全部替换成字母的下一个字母,要是最后一位是z或Z则替换为a或A. *        输入:aBxyZ *        输出:bCyzA #include<iostream> #include<string> #include<cctype> using namespace std; char ml[]="abcdefghijklmnopqrstuvwxyza"; char mu[]="ABCDEFGHIJKLMN

华为机试:字符串分隔

题目描述 •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组: •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于100) 输出描述: 输出到长度为8的新字符串数组 示例1 输入 abc 123456789 输出 abc00000 12345678 90000000 Java: 1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public cl

华为机试题目---字符串替换

题目要求:输入一个字符串,然后在输入一个整数,就是替换字符串的次数,然后依次输入需要替换的字符串-- 例如: 输入:abcdefg 3 a->qwe b->s fg->abc 输出:qwescdeabc //字符串替换 #include<iostream> #include<vector> #include<string> #define max 100 using namespace std; void change(char str[],int c

2015华为机试——将字符串中不同字符的个数打印出来

描述: 找出字符串中,不同的字符的个数. 题目类别: 字符串 难度: 初级 运行时间限制: 无限制 内存限制: 无限制 阶段: 入职前练习 输入: 输入一个字符串,'\0'作为字符串结束符. 输出: 输出字符串中不同字符的个数. 样例输入: 122345 样例输出: 5 代码如下: public class dayin_Char { public static void main(String[] args) { Scanner sc=new Scanner(System.in); while

2015华为机试—— 计算二进制数的0的个数

描述: 输入一个10进制数字,请计算该数字对应二进制中0的个数,注意左数第一个1之前的所有0都不需要计算.不需要考虑负数的情况. 题目类别:位运算 难度:初级 运行时间限制:无限制 内存限制:无限制 阶段:入职前练习 输入: 要计算的十进制非负数 输出: 二进制中第一个1之后0 的个数 样例输入: 2 样例输出: 1 解题思路: 对于给定的数n,使用位运算:n=n&(n-1)可计算出对应二进制中1的个数,为count1.将input=n,input=input>>1逐个获取input中

华为机试—给定字符串中找出单词

题目: 在给定字符串中找出单词("单词"由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格.问号.数字等等:另外单个字母不算单词):找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中:如果某个单词重复出现多次,则只输出一次:如果整个输入的字符串中没有找到单词,请输出空串.输出的单词之间使用一个"空格"隔开,最后一个单词后不加空格. 要求实现函数: void my_word(charinput[

华为机试 计算字符个数

题目描述 写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数.不区分大小写. 输入描述: 输入一个有字母和数字以及空格组成的字符串,和一个字符. 输出描述: 输出输入字符串中含有该字符的个数. 输入 ABCDEF A 输出 1 #include<iostream> #include<string.h> using namespace std; int main(){ string s; char ss; int count=0; cin