计算字符间距的C语言,计算字符串的距离

14

python solution: def editDistance(str1, str2):

len1, len2 = len(str1) + 1, len(str2) + 1

dp = [[0 for i in range(len2)] for j in range(len1)]

for i in range(len1):

dp[i][0] = i

for j in range(len2):

dp[0][j] = j

for i in range(1, len1):

for j in range(1, len2):

dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + (str1[i - 1] != str2[j - 1]))

return dp[-1][-1]

while True:

try:

print(editDistance(input(), input()))

except:

break

发表于 2017-10-17 14:57:35

回复(9)

30

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

while(in.hasNext()){

String strA = in.next();

String strB = in.next();

int ic = 1;

int dc = 1;

int rc = 1;

int cost = strEditCost(strA, strB, ic, dc, rc);

System.out.println(cost);

}

in.close();

}

public static int strEditCost(String strA, String strB, int ic, int dc, int rc){

/* 字符串之间的距离,编辑距离,将strA编辑成strB所需的最小代价

* 编辑操作包括插入一个字符、删除一个字符、替换一个字符

* 分别对应的代价是ic、dc、rc,insert cost、delete cost、replace cost

* strA[x-1]代表strA的第x个字符,注意下标是从0开始的,strA[y-1]代表strA的第y个字符

* 定义一个代价矩阵为(N+1)*(M+1),M N 表示strA strB的长度

* dp[x][y]表示strA的前x个字符串编辑成 strB的前y个字符所花费的代价

* dp[x][y]是下面几种值的最小值:

* 1、dp[x][y] = dp[x-1][y] + dc

* dp[x-1][y]将strA的前x-1个字符编辑成strB的前y个字符的代价已知,

* 那么将将strA的前x个字符编辑成strB的前y个字符的代价dp[x][y]就是dp[x-1][y] + dc

* 相当于strA的前x-1个字符编辑成strB的前y个字符,现在变成了strA的前x个字符,增加了一个字符,要加上删除代价

* 2、dp[x][y] = dp[x][y-1] + ic

* dp[x][y-1]将strA的前x个字符编辑成strB的前y-1个字符的代价已知,

* 现在变为strB的前y个字符,相应的在strA前x个操作代价的基础上插入一个字符

* 3、dp[x][y] = dp[x-1][y-1]

* dp[x-1][y-1]将strA的前x-1个字符编辑成strB的前y-1个字符的代价已知,

* strA的第x个字符和strB的第y个字符相同,strA[x-1] == strB[y-1],没有引入操作

* 4、dp[x][y] = dp[x-1][y-1] + rc

* strA的第x个字符和strB的第y个字符不相同,strA[x-1] != strB[y-1],

* 在strA的前x-1个字符编辑成strB的前y-1个字符的代价已知的情况下,

* 计算在strA的前x字符编辑成strB的前y个字符的代价需要加上替换一个字符的代价

* */

int m = strA.length();

int n = strB.length();

int[][] dp = new int[m + 1][n + 1];

for (int i = 1; i <= n; i++) dp[0][i] = i*ic;

for (int i = 1; i <= m; i++) dp[i][0] = i*dc;

for (int x = 1; x <= m; x++) {

for (int y = 1; y <= n; y++) {

int cost1 = dp[x-1][y] + dc;

int cost2 = dp[x][y-1] + ic;

int cost3 = 0;

if(strA.charAt(x-1) == strB.charAt(y-1))

cost3 = dp[x-1][y-1];

else

cost3 = dp[x-1][y-1] + rc;

dp[x][y] = Math.min(cost1, cost2);

dp[x][y] = Math.min(dp[x][y], cost3);

}

}

return dp[m][n];

}

}

编辑于 2017-06-28 12:54:18

回复(5)

29

//思路主要:

u

如果两个串的第一个字符相同

,如A=xabcdae和B=xfdfa,只要计算

A[2,…,7]=abcdae和B[2,…,5]=fdfa的距离就可以了。

u

如果两个串的第一个字符不相同

,那么可以进行如下的操作:

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]的距离。

动态规划思路为:

* 设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)值。

package com.wenjie.huawei;

import java.util.Scanner;

public class CalStringDistance {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner sc = new Scanner(System.in);

while (sc.hasNext()) {

String str1 = sc.nextLine();

String str2 = sc.nextLine();

System.out.println(stringDistance(str1.toCharArray(),str2.toCharArray()));

}

}

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];

}

}

编辑于 2017-06-14 21:27:16

回复(5)

15

//典型的动态规划优化编辑器问题

//参考博客 http://blog.csdn.net/shizheng163/article/details/50988023

#include

#include

#include

using namespace std;

int calStringDistance(string a,string b){

int n = (int)a.size(),m = (int)b.size();

vector>dp(n+1,vector(m+1,0));

dp[0][0] = 0;//dp[x][y]代表将a字符串前x个字符修改成b字符串前y个字符

for (int i=1; i<=m; ++i) dp[0][i] = i;

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

for (int i=1; i<=n; ++i) {

for (int j=1; j<=m; ++j) {

int one = dp[i-1][j] +1,two = dp[i][j-1]+1,three = dp[i-1][j-1];

if(a[i-1]!=b[j-1]) three+=1;

dp[i][j] = min(min(one,two),three);

}

}

return dp[n][m];

}

int main(){

string a,b;

while(cin>>a>>b)

cout<

return 0;

}

编辑于 2016-04-01 21:30:35

回复(7)

8

def edit_distance(s1,s2):

len1 = len(s1) + 1

len2 = len(s2) + 1

edit = [[i + j for j in range(len2)] for i in range(len1)]

for i in range(1,len1):

for j in range(1,len2):

if s1[i-1] == s2[j-1]:

d = 0

else:

d = 1

edit[i][j] = min(edit[i][j-1]+1,edit[i-1][j]+1,edit[i-1][j-1]+d)

return edit[-1][-1]

while True:

try:

print(edit_distance(input(), input()))

except:break

推荐大家看个文章,什么都懂了

发表于 2020-05-14 15:39:57

回复(4)

4

#include

#include

#include

#include

using namespace std;

//空间可以优化成O(n)

int main() {

string s1, s2;

while (cin >> s1 >> s2) {

vector> dp(s1.size() + 1, vector(s2.size() + 1, 0));

for (int i = 1; i <= s2.length(); i++) dp[0][i] = i;

for (int i = 1; i <= s1.length(); i++) dp[i][0] = i;

for(int i=1;i<=s1.length();i++)

for (int j = 1; j <= s2.length(); j++) {

int min1 = min(dp[i - 1][j], dp[i][j - 1]) + 1;

dp[i][j] = min((s1[i - 1] == s2[j - 1] ? 0 : 1) + dp[i - 1][j - 1], min1);

}

cout << dp[s1.size()][s2.size()] << endl;

}

}

发表于 2017-03-17 16:16:10

回复(0)

6

/*

本题删除,替换,插入代价全是 1

*/

#include

#include

using namespace std;

int calStringDistance(string A,string B);

int main()

{

string charA;

string charB;

while(getline(cin,charA)&&getline(cin,charB))

{

cout<

}

return 0;

}

int calStringDistance(string A,string B)

{

int row=A.size();//字符串A的长度

int col=B.size();//字符串B的长度

int **dp=new int*[row+1];//动态创建一个二维数组

for(int i=0;i

{

dp[i]=new int[col+1]();

}

dp[0][0]=0;//这里代价是0,也就是空字符到空字符,不需要任何编辑

for(int i=1;i

{

dp[i][0]=i;

}

for(int j=1;j

{

dp[0][j]=j;

}

for(int i=1;i

{

for(int j=1;j

{

if(A[i-1]==B[j-1])

{

dp[i][j]=dp[i-1][j-1];//如果i和j位置字符相同,说明i和j位置的字符不需要编辑。dp[i][j]=dp[i-1][j-1]

}

else

{

dp[i][j]=dp[i-1][j-1]+1;//这里需要一个替换代价

}

dp[i][j]=min(dp[i-1][j]+1,dp[i][j]);

dp[i][j]=min(dp[i][j],dp[i][j-1]+1);

}

}

return dp[row][col];

}

发表于 2016-04-01 11:22:56

回复(1)

2

/*

方法:动态规划

状态:

子状态:word1的前1,2,3,...m个字符转换成word2的前1,2,3,...n个字符需要的编辑距离

F(i,j):word1的前i个字符于word2的前j个字符的编辑距离

状态递推:

F(i,j) = min { F(i-1,j)+1, F(i,j-1) +1, F(i-1,j-1) +(w1[i]==w2[j]?0:1) }

上式表示从删除,增加和替换操作中选择一个最小操作数

F(i-1,j): w1[1,...,i-1]于w2[1,...,j]的编辑距离,删除w1[i]的字符--->F(i,j)

F(i,j-1): w1[1,...,i]于w2[1,...,j-1]的编辑距离,增加一个字符--->F(i,j)

F(i-1,j-1): w1[1,...,i-1]于w2[1,...,j-1]的编辑距离,如果w1[i]与w2[j]相同,

不做任何操作,编辑距离不变,如果w1[i]与w2[j]不同,替换w1[i]的字符为w2[j]--->F(i,j)

初始化:

初始化一定要是确定的值,如果这里不加入空串,初始值无法确定

F(i,0) = i :word与空串的编辑距离,删除操作

F(0,i) = i :空串与word的编辑距离,增加操作

返回结果:F(m,n)

注:字符串类的动态规划,可引入空串进行初始化

*/

#include 

#include 

#include 

using namespace std;

int editDistance(string str1, string str2){

if(str1.empty() || str2.empty()){

return max(str1.size(), str2.size());

}

const int m = str1.size() + 1;

const int n = str2.size() + 1;

vector> F(m, vector(n, 0));

for(int i = 0; i 

F[i][0] = i;

}

for(int j = 0; j 

F[0][j] = j;

}

for(int i = 1; i 

for(int j = 1; j 

// 从删除,增加和替换操作中选择一个最小操作数

F[i][j] = min(min(F[i - 1][j] + 1, F[i][j - 1] + 1), F[i - 1][j - 1] + (str1[i - 1] == str2[j - 1] ? 0 : 1));

}

}

return F[m - 1][n - 1];

}

int main(){

string str1, str2;

while(cin >> str1 >> str2){

cout <

}

return 0;

}

发表于 2020-06-19 22:22:00

回复(1)

2

计算莱文斯坦距离

递归思路非常简单,逐个考察每对字符,相同则同时继续考察下一对,不同则考虑替换、插入或删除(由于两字符串是相对关系所以其实算是一种),当一方字符串已经考察完毕,另一方剩下的字符数量加入

不足的是本题中可能存在运算超时,所以想要通过示例需要将递归过程用数组保存并进行递推,不过递归思路贴出来可供大家参考 int getDistance(char str1[],char str2[],int k1,int k2,int len1,int len2){

if (len1-k1==0) //当其中某个字符串剩余考察长度为0的时候,编辑距离就是另一个字符串的长度

return len2-k2;

else if (len2-k2==0)

return len1-k1;

else {

if (str1[k1]==str2[k2]) //当前字符比较相等的时候,继续从两字符串下一位置考察

return getDistance(str1, str2, k1+1, k2+1, len1, len2);

else { //当前字符比较不等的时候

//分别考虑替换(均从两字符串下一位置考察,当前位置视为替换)

int a=getDistance(str1, str2, k1+1, k2+1, len1, len2)+1;

//插入或删除(一方停留当前位置,另一方考察下一位置)

int b=getDistance(str1, str2, k1, k2+1, len1, len2)+1;

int c=getDistance(str1, str2, k1+1, k2, len1, len2)+1;

return a

}

}

}

int main(){

int getDistance(char [],char [],int ,int ,int ,int );

char str1[100],str2[100];

while (~scanf("%s %s",str1,str2)) {

printf("%d\n",getDistance(str1, str2, 0, 0, (int)strlen(str1), (int)strlen(str2))); //初始考察位置均为0

}

return 0;

}

编辑于 2020-05-20 11:30:58

回复(1)

2

#include

(720)#include

using namespace std;

int main()

{

string A,B;

while(cin>>A>>B)

{

int len_A=A.size();

int len_B=B.size();

if(len_A==0||len_B==0)

return len_A+len_B;

vectorrecord(len_B+1,0);

for(int j=0;j<=len_B;j++)

record[j]=j;

for(int i=1;i<=len_A;i++)

{

int lu=record[0];record[0]=i;

for(int j=1;j<=len_B;j++)

{

int k=record[j];

if(A[i-1]==B[j-1])

lu-=1;

record[j]=1+min(record[j],min(record[j-1],lu));

lu=k;

}

}

cout<

}

}

一维数组dp省内存,一维数组要替换的数就二维数组dp的上面那个数,左边的数也就是一维数组左边的,

只是左上的数不能体现,可以单独用变量表示lu,而k表示存储下一个数的左上,最后赋值给lu

发表于 2020-04-09 13:55:58

回复(0)

1

/*

如何计算编辑距离:

1.两字字串都为空,编辑距离为0

2.当其中一个为空时,编辑距离为另外一个字串的长度。

3.当两个字串非空时(长度分别为i 和 j时),取下面3种情况最小值:

3.1 当i-1 和 j的编辑距离已知时,直接+1 为 i和j的编辑距离

3.2 当i 和 j-1的编辑距离已知时,直接+1 为 i和j的编辑距离

3.3 当i-1 和 j-1的编辑距离已知时,如果i字符和j字符相等则+0,如果不相等则+1为 i和j的编辑距离。

应该用动态规划:

int dp[m+1][n+1] //定义长度为i的字串和长度为j的字串之间的编辑距离

两个字符串最前面插入一个空字符,初始化[i][0] base case 为i,初始化[0][j] base case 为j;

编写状态转移方程。

*/

int cal_distance(string sline1,string sline2)

{

if ((sline1.empty())&&(sline2.empty())){

return 0;

}

if ((sline1.empty())&&(!sline2.empty())){

return sline2.size();

}

if ((!sline1.empty())&&(sline2.empty())){

return sline1.size();

}

sline1.insert(sline1.begin(),' ');

sline2.insert(sline2.begin(),' ');

int m = sline1.size();

int n = sline2.size();

vector> dp(m, vector(n,0));//定义长度为i的字串和长度为j的字串之间的编辑距离

for (int i=0;i

dp[i][0] = i;

}

for (int j=0;j

dp[0][j] = j;

}

for (int i=1;i

for (int j=1;j

int add;

if (sline1[i] == sline2[j]){

add = 0;

}

else{

add = 1;

}

int dp1 = dp[i-1][j-1] + add;

int dp2 = dp[i-1][j]+1;

int dp3 = dp[i][j-1]+1;

if (dp1>dp2){

dp1 = dp2;

}

if (dp1>dp3){

dp1 = dp3;

}

dp[i][j] = dp1;

}

}

return dp[m-1][n-1];

}

int _tmain(int argc, _TCHAR* argv[])

{

string sline1, sline2;

while(cin >> sline1)

{

cin >> sline2;

int length = cal_distance(sline1,sline2);

cout <

}

return 0;

}

发表于 2021-04-18 16:27:17

回复(0)

1

动态规划,dp[i][j]代表i到j的编辑距离

public static void main(String[] args){

Scanner in = new Scanner(System.in);

while(in.hasNext()){

String a = in.nextLine();

String b = in.nextLine();

int m = a.length();

int n = b.length();

int[][] dp = new int[m + 1][n + 1];

//初始化状态

for(int i = 1;i <= m;i++){

dp[i][0] = i;

}

for(int j = 1;j <= n;j++){

dp[0][j] = j;

}

for(int i = 1;i <= m;i++){

for(int j = 1;j <= n;j++){

if(a.charAt(i - 1) == b.charAt(j - 1)){

dp[i][j] = dp[i - 1][j - 1];

}else{

dp[i][j] = Math.min(dp[i - 1][j - 1],Math.min(dp[i - 1][j],dp[i][j - 1])) + 1;

}

}

}

System.out.println(dp[m][n]);

}

}

发表于 2021-04-15 15:37:45

回复(0)

1

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner cin = new Scanner(System.in);

while (cin.hasNext()) {

String s1 = " " + cin.next(), s2 = " " + cin.next();

System.out.println(calStringDistance(s1, s2));

}

}

public static int calStringDistance(String charA, String charB) {

int n = charA.length(), m = charB.length();

int[][] lev = new int[n][m];

int cost;

for (int i = 0; i 

for (int j = 0; j 

for (int i = 1; i 

for (int j = 1; j 

char ch1 = charA.charAt(i), ch2 = charB.charAt(j);

if (ch1 == ch2) cost = 0;

else cost = 1;

lev[i][j] = getMin(lev[i - 1][j] + 1, lev[i][j - 1] + 1, lev[i - 1][j - 1] + cost);

}

}

return lev[n - 1][m - 1];

}

public static int getMin(int a, int b, int c) {

a = Math.min(a, b);

b = Math.min(b, c);

return Math.min(a, b);

}

}

发表于 2020-08-22 20:30:14

回复(0)

1

最小编辑距离,经典的动态规划问题之一,类似的还有最大公共子串,最大公共序列,最大递增序列,01

背包问题等等

#include 

#include 

#include 

#include 

using namespace std;

int main(){

string s1,s2;

while(cin>>s1>>s2){

int len1=s1.size();

int len2=s2.size();

vector>dp(len1+1,vector(len2+1,0));

for(int i=1;i<=len1;i++){

dp[i][0]=i;

}

for(int j=1;j<=len2;j++){

dp[0][j]=j;

}

dp[0][0]=0;

for(int i=1;i<=len1;i++){

for(int j=1;j<=len2;j++){

if(s1[i-1]==s2[j-1])

dp[i][j]=dp[i-1][j-1];

else{

int tem=min(dp[i-1][j],dp[i][j-1]);

dp[i][j]=min(dp[i-1][j-1],tem)+1;

}

}

}

cout<

}

return 0;

}

发表于 2020-02-16 20:08:55

回复(0)

1

动态规划算法之一,编辑距离。不要搞得这么复杂吓死人,看帖了解距离矩阵,按公式编程即可。

贴出参考的帖子地址:

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

while(in.hasNext()){

String strA = in.next();

String strB = in.next();

int cost = strEditCost(strA, strB);

System.out.println(cost);

}

in.close();

}

public static int strEditCost(String strA, String strB){

int m = strA.length() + 1;

int n = strB.length() + 1;

int[][] dp = new int[m][n];

// 初始化0列0行先,这个距离是可以预先知道的

for(int i = 0;i

dp[i][0] = i;

}

for(int j = 0;j

dp[0][j] = j;

}

// 当 i,j都是大于0时

for(int i = 1;i

for(int j=1;j

int cout1 = Math.min(dp[i-1][j] + 1,dp[i][j-1] + 1);

int dc = 1;

if(strA.charAt(i-1) == strB.charAt(j-1)) {

dc = 0;

}

int cout2 = Math.min(cout1,dp[i-1][j-1]+dc);

dp[i][j] = cout2;

}

}

return dp[m-1][n-1];

}

}

发表于 2019-11-02 23:47:13

回复(1)

1

动态规划 import java.util.*;

public class Main {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

while(in.hasNext()) {

String str1 = in.nextLine();

String str2 = in.nextLine();

System.out.println(calStringDistance(str1,str2));

}

}

private static int calStringDistance(String str1,String str2){

int M = str1.length();

int N = str2.length();

//dp[i][j] 代表 str1[0...i-1] 编辑成 str2[0...j-1] 的最小代价

int[][] dp = new int[M+1][N+1];

//将 "" 编辑成 ""

dp[0][0] = 0;

//将 str1[0...i-1] 编辑成 "" 的代价

for(int i = 1;i < M+1;i++){

dp[i][0] = i;

}

//将 "" 编辑成 str2[0...j-1] 的代价

for(int j = 1;j < N+1;j++){

dp[0][j] = j;

}

for(int i = 1;i < M+1;i++){

for(int j = 1;j < N+1;j++){

//str1[0...i-1] 先编辑成str1[0...i-2],然后由str1[0...i-2]编辑成str2[0...j-1]

int c1 = 1 + dp[i-1][j];

//str1[0...i-1] 先编辑成str2[0...j-2],然后由str2[0...j-2]编辑成str2[0...j-1]

int c2 = dp[i][j-1] + 1;

//如果str1[i-1] != str2[j-1]。先把str1[0...i-1]中str1[0...i-2]的部分变为str2[0...j-2]

//然后把字符str1[i-1]替换成str2[j-1]

int c3 = dp[i-1][j-1] + 1;

//如果str1[i-1] == str2[j-1]。把str1[0...i-1]中str1[0...i-2]的部分变为str2[0...j-2]即可

int c4 = dp[i-1][j-1];

if(str1.charAt(i-1) != str2.charAt(j-1)){

dp[i][j] = Math.min(Math.min(c1,c2),c3);

}else {

dp[i][j] = Math.min(Math.min(c1,c2),c4);

}

}

}

return dp[M][N];

}

}

发表于 2019-08-22 16:24:11

回复(0)

1

#include

#include

#include

using namespace std;

int main(){

string a,b;

while(cin>>a>>b)

{

int n = a.size(),m = b.size();

vector>dp(n+1,vector(m+1));/*dp[x][y]代表将a字符串的前x个字符(从1编号,a的前1个字符为a[0],

前两个字符为a[0]和a[1])转换成b字符串的前y个字符*/

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

for (int j=0; j<=m; j++) dp[0][j] = j;

for (int i=1; i<=n; i++)

for (int j=1; j<=m; ++j)

{

int d1 = dp[i-1][j] +1,d2 = dp[i][j-1]+1,d3 = dp[i-1][j-1];

if(a[i-1]!=b[j-1]) d3+=1; //注意由于a的前i-1个字符时从1编号,则第i个字符也是从1编号,为a[i-1],同理b[j-1]

dp[i][j] = min(min(d1,d2),d3);

}

cout<

}

return 0;

}

发表于 2018-07-08 01:01:58

回复(0)

1

import java.util.*;

public class Main{

public static void main(String[] args){

Scanner input=new Scanner(System.in);

while(input.hasNext()){

String s1=input.nextLine();

String s2=input.nextLine();

System.out.println(stringDistance(s1.toCharArray(), s2.toCharArray()));

}

}

public 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];

}

}

发表于 2018-06-29 15:56:37

回复(0)

1

import java.util.Scanner;

public class P052StringDistance {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

while(sc.hasNext()){

String strA = sc.next();

String strB = sc.next();

System.out.println(calStrDis(strA, strB, strA.length(), strB.length()));

}

sc.close();

}

public static int calStrDis(String strA, String strB, int m, int n) {

int[][] dp = new int[m+1][n+1];

for (int i = 0; i <= m; i++) {

for (int j = 0; j <= n; j++) {

if(i == 0)//strA为空。

dp[i][j] = j;

else if(j == 0)//strB为空。

dp[i][j] = i;

else if(strA.charAt(i - 1) == strB.charAt(j - 1))//strA和strB最后一个字符相同。

dp[i][j] = dp[i-1][j-1];

else//strA和strB最后一个字符不同。

dp[i][j] = 1 + min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]);//strA的所有操作:插入,删除,替换。 }

}

return dp[m][n];

/*//直接递归,运行超时。

if(m == 0) return n;

if(n == 0) return m;

if(strA.charAt(m - 1) == strB.charAt(n - 1))

return calStrDis(strA, strB, m - 1, n - 1);

return 1 + min(calStrDis(strA, strB, m, n - 1), calStrDis(strA, strB, m - 1, n), calStrDis(strA, strB, m - 1, n - 1));

*/

}

public static int min(int x, int y, int z) {

if(x < y && x < z)

return x;

else if(y < x && y < z){

return y;

else

return z;

}

发表于 2018-06-12 22:55:51

回复(0)

1

import java.util.Scanner;

public class Main{

public static void main(String[] args) {

Scanner in = new Scanner(System.in);

while(in.hasNextLine()){

String s1=in.nextLine();

String s2=in.nextLine();

System.out.println(calStringDistance(s1,s2));

}

}

private static int calStringDistance(String s1, String s2) {

int len1 = s1.length();

int len2 = s2.length();

char[] c1 = s1.toCharArray();

char[] c2 = s2.toCharArray();

if(len1==0){

return len2;

}

if(len2 ==0){

return len1;

}

int[][] a = new int[len1+1][len2+1];

for(int i=0;i

a[i][0]=i;

}

for(int j=0;j

a[0][j] =j;

}

for(int i=1;i

for(int j=1;j

int temp=Math.min(a[i-1][j]+1, a[i][j-1]+1);

int num=c1[i-1]==c2[j-1]?0:1;

a[i][j]=Math.min(temp, a[i-1][j-1]+num);

}

}

return a[len1][len2];

}

}

编辑于 2017-04-17 16:50:34

回复(0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值