华为机试---计算字符串的距离

原创 2016年05月31日 21:01:31

题目描述

Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。

Ex:

字符串A:abcdefg

字符串B: abcdef

通过增加或是删掉字符”g”的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。

要求:

给定任意两个字符串,写出一个算法计算它们的编辑距离。

 

请实现如下接口

/* 功能:计算两个字符串的距离

 * 输入:字符串A和字符串B

 * 输出:无

 * 返回:如果成功计算出字符串的距离,否则返回-1

 */


输入描述:

输入两个字符串

输出描述:

得到计算结果

输入例子:
abcdefg
abcdef
输出例子:
1
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);		
		while (scan.hasNext()) {
			String str1 = scan.nextLine();
			String str2 = scan.nextLine();
			int distance = calStringDistance(str1, str2);
			System.out.println(distance);
		}//endwhile		
		scan.close();
	}
	/**
	 * 计算两个字符串的距离
	 * 删除、替换、插入距离都为1
	 * */
	private static int calStringDistance(String str1 , String str2){
		int n = str1.length();
		int m = str2.length();
		//创建二维数组保存编辑距离
		//dp[i][j]代表将str1的前i个字符修改成str2的前j个字符的编辑距离
		int[][] distance = new int[n + 1][m + 1];
		//1、如果str1和str2都为空,编辑距离为0
		distance[0][0] = 0;
		//2、如果str1为空,str2不为空,str1修改成str2的前j个字符的编辑距离就是j;j次插入操作
		for(int j = 1 ; j <= m; ++j){
			distance[0][j] = j;
		}
		//3、如果str2为空,str1不为空,str1的前i个字符修改成str2的编辑距离就是i;i次删除操作
		for(int i = 1 ; i <= n; ++i){
			distance[i][0] = i;
		}
		//4、如果str1和str2都不为空
		for(int i = 1 ; i <=n ; i++){
			for(int j = 1; j <= m ; j++){
				if(str1.charAt(i - 1) == str2.charAt(j - 1)){
					//如果i和j位置的字符相同,编辑距离与 i-1修改成j-1相同
					distance[i][j] = distance[i - 1][j - 1];
				}else{
					//如果i和j位置的字符不相同,编辑距离有三种情况
					/* (1) i-1修改成j的编辑距离+1
					 * (2) i修改成j-1的编辑距离+1
					 * (3) i-1修改成j-1的编辑距离+1
					 * 取三者的最小值,得出前i个字符修改成前j个字符的最少编辑操作
					 * */
					distance[i][j] = 1 + min(distance[i - 1][j] , distance[i][j - 1] , distance[i - 1][j - 1]);
				}
			}	
		}
		return distance[n][m];
	}
	/**
	 * 求三个整数中的最小值
	 * */
	private static int min(int i, int j, int k) {
		int min = i;
		if(min > j ){
			min = j;
		}
		if(min > k){
			min = k;
		}
		return min;		
	}
}


java ------华为上机机试--计算字符串个数

题目描述 写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。 输入描述: 输入一个有字母和数字以及空格组成的字符串,...

华为机试之计算字符串运算结果

#include using namespace std; void arithmetic(const char *input,long len,char *output) { char p1[10...

华为机试 - 计算字符串表达的运算

通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。 输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。 补充说明: ...

字符串四则运算表达式的计算(华为机试)

简单四则运算 问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注 1、表达式只含 +, -, *, / 四则运算符,不含括号 2、表达式数值只包含个位整数(0...

华为机试 删除字符串中所有给定的子串

问题描述:  在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。 要求实现函数:  int delete_sub_str(const char *str, const ...

华为机试—输出包含名字的个数和字符串

题目: 输入一个n,再输入n个字符串,再输入一个名字串,输出包含名字串的个数和字符串。 输入: 10 sfsfjacksdf jajajack jack jjjjjjjjckd ...

华为机试—字符串压缩

题目:字符串压缩 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩规则: 1. 仅压缩...

华为机试:简单密码破解、字符串通配符

1.简单密码破解 题目描述 密码是我们生活中非常重要的东东,我们的那么一点不能说的秘密就全靠它了。哇哈哈. 接下来渊子要在密码之上再加一套密码,虽然简单但也安全。 假设渊子原来一个BBS上的密码...

华为机试在线训练-牛客网(18)字符串合并处理

题目描述 按照指定规则对输入的字符串进行处理。 详细描述: 将输入的两个字符串合并。 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。...

[华为机试练习题]12.整型字符串排序

题目给定字符串内有很多正整数,要求对这些正整数进行排序,然后返回排序后指定位置的正整数 排序要求:按照每个正整数的后三位数字组成的整数进行从小到大排序 1)如果不足三位,则按照实际位数组成的整数进行...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:华为机试---计算字符串的距离
举报原因:
原因补充:

(最多只允许输入30个字)