博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算字符串的距离
阅读量:6238 次
发布时间:2019-06-22

本文共 4029 字,大约阅读时间需要 13 分钟。

hot3.png

题目描述

Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。Ex:    字符串A:abcdefg    字符串B: abcdef    通过增加或是删掉字符”g”的方式达到目的。这两种方案都需要一次操作。把这个操作所需要的次数定义为两个字符串的距离。要求:    给定任意两个字符串,写出一个算法计算它们的编辑距离。请实现如下接口/** * 功能:计算两个字符串的距离 * 输入:字符串A和字符串B * 输出:无 * 返回:如果成功计算出字符串的距离,否则返回-1 */public static int stringDistance (String charA, String  charB){   return 0;}

输入描述

输入两个字符串

输出描述

得到计算结果

输入例子

abcdefgabcdef

输出例子

1

算法实现

import java.util.Scanner;/** * Declaration: All Rights Reserved !!! */public class Main {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));        while (scanner.hasNext()) {            String a = scanner.nextLine();            String b = scanner.nextLine();            System.out.println(stringDistance(a, b));        }        scanner.close();    }    private static int stringDistance(String a, String b) {//        System.out.println(stringDistance(a.toCharArray(), 0, b.toCharArray(), 0));        return stringDistance(a.toCharArray(), b.toCharArray());    }    /**     * 方法一、计算量过大     * 
     * 两个字符串的距离肯定不超过它们的长度之和(我们可以通过删除操作把两个串都转化为空串)。     * 虽然这个结论对结果没有帮助,但至少可以知道,任意两个字符串的距离都是有限的。     * 我们还是应该集中考虑如何才能把这个问题转化成规模较小的同样的问题。     * 如果有两个串A=xabcdae和B=xfdfa,它们的第一个字符是相同的,只要计算A[2,…,7]=abcdae     * 和B[2,…,5]=fdfa的距离就可以了。但是如果两个串的第一个字符不相同,     * 那么可以进行如下的操作(lenA和lenB分别是A串和B串的长度):     * 1.删除A串的第一个字符,然后计算A[2,…,lenA]和B[1,…,lenB]的距离。     * 2.删除B串的第一个字符,然后计算A[1,…,lenA]和B[2,…,lenB]的距离。     * 3.修改A串的第一个字符为B串的第一个字符,然后计算A[2,…,lenA]和B[2,…,lenB]的距离。     * 4.修改B串的第一个字符为A串的第一个字符,然后计算A[2,…,lenA]和B[2,…,lenB]的距离。     * 5.增加B串的第一个字符到A串的第一个字符之前,然后计算A[1,…,lenA]和B[2,…,lenB]的距离。     * 6.增加A串的第一个字符到B串的第一个字符之前,然后计算A[2,…,lenA]和B[1,…,lenB]的距离。     *     * 在这个题目中,我们并不在乎两个字符串变得相等之后的字符串是怎样的。所以,可以将上面6个操作合并为:     * 1.一步操作之后,再将A[2,…,lenA]和B[1,…,lenB]变成相同字符串。     * 2.一步操作之后,再将A[1,…,lenA]和B[2,…,lenB]变成相同字符串。     * 3.一步操作之后,再将A[2,…,lenA]和B[2,…,lenB]变成相同字符串。     * 
* * @param a * @param i * @param b * @param j * @return */ private static int stringDistance(char[] a, int i, char[] b, int j) { if (i >= a.length || j >= b.length) { return Math.max(a.length - i, b.length - j); } // 字符相等 if (a[i] == b[j]) { return stringDistance(a, i + 1, b, j + 1); } else { int d1 = stringDistance(a, i + 1, b, j); int d2 = stringDistance(a, i + 1, b, j + 1); int d3 = stringDistance(a, i, b, j + 1); return Math.min(Math.min(d1, d2), d3) + 1; } } /** * 方法二 *
     * 很经典的可使用动态规划方法解决的题目,和计算两字符串的最长公共子序列相似。     *     * 设Ai为字符串A(a1a2a3 … am)的前i个字符(即为a1,a2,a3 … ai)     * 设Bj为字符串B(b1b2b3 … bn)的前j个字符(即为b1,b2,b3 … bj)     *     * 设 L(i,j)为使两个字符串和Ai和Bj相等的最小操作次数。     * 当ai==bj时 显然 L(i,j) = L(i-1,j-1)     * 当ai!=bj时     *     *  若将它们修改为相等,则对两个字符串至少还要操作L(i-1,j-1)次     *  若删除ai或在bj后添加ai,则对两个字符串至少还要操作L(i-1,j)次     *  若删除bj或在ai后添加bj,则对两个字符串至少还要操作L(i,j-1)次     *  此时L(i,j) = min( L(i-1,j-1), L(i-1,j), L(i,j-1) ) + 1     *     * 显然,L(i,0)=i,L(0,j)=j, 再利用上述的递推公式,可以直接计算出L(i,j)值。     * 
* * @param a * @param b * @return */ private static int stringDistance(char[] a, char[] b) { int[][] len = new int[a.length + 1][b.length + 1]; for (int i = 0; i < len.length; i++) { len[i][0] = i; } for (int j = 0; j < len[0].length; j++) { len[0][j] = j; } for (int i = 1; i < len.length; i++) { for (int j = 1; j < len[0].length; j++) { if (a[i - 1] == b[j - 1]) { len[i][j] = len[i - 1][j - 1]; } else { len[i][j] = Math.min(Math.min(len[i - 1][j], len[i - 1][j - 1]), len[i][j - 1]) + 1; } } } return len[len.length - 1][len[0].length - 1]; }}

转载于:https://my.oschina.net/u/2822116/blog/823495

你可能感兴趣的文章
Linux学习之查看文件和文件夹大小
查看>>
明明白白你的Linux服务器——硬件篇(1)
查看>>
osgi启动级别
查看>>
php防止快速刷屏留言
查看>>
python 登录验证程序
查看>>
Linux
查看>>
限制linux 用户使用su命令转化root权限
查看>>
headfirst PMP-忽视项目职责范围会带来哪些问题?
查看>>
PHP缓存学习之redis
查看>>
以lnmp为基础搭建discuz论坛
查看>>
云计算网络基础-金老师
查看>>
Vim编辑器与Shell编辑器
查看>>
Cisco交换路由配置命令及说明
查看>>
解析sort命令
查看>>
mysql慢查询
查看>>
体会瞬间的舒爽
查看>>
我的友情链接
查看>>
关于网站访问出现的以下问题
查看>>
FFmpeg架构之其他重要数据结构的初始化
查看>>
List(二)
查看>>