華爲OJ計算字符串的相似度

題目:計算字符串的相似度

描述

對於不同的字符串,我們希望能有辦法判斷相似程度,我們定義了一套操作方法來把兩個不相同的字符串變得相同,具體的操作方法如下:

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。

 

 

 

知識點
運行時間限制 10M
內存限制 128
輸入

輸入兩個字符串

輸出

輸出相似度,string類型

樣例輸入 abcdef abcdefg
樣例輸出 1/2
#include <iostream>
#include <string>

#define Max(a,b) (a)>(b)?(a):(b)
using namespace std;

int table[100][100] = { 0 };
string calculateStringDistance(string expressionA, string expressionB)
{
	int lenA = expressionA.length();
	int lenB = expressionB.length();
	for (int i = 1; i <= lenA; i++)
	{
		for (int j = 1; j <= lenB; j++)
		{
			if (expressionA[i] == expressionB[j])
			{
				table[i][j] = table[i - 1][j - 1] + 1;
			}
			else
			{
				table[i][j] = Max(table[i - 1][j], table[i][j - 1]);
			}
		}
	}

	int maxCommonSerial = table[lenA][lenB];
	int distance = Max(lenA, lenB) - maxCommonSerial;
	char ch[10];
	sprintf_s(ch, "1/%d", distance + 1);
	string str(ch);
	return str;
}

int main(void)
{
	string strA, strB;
	cin >> strA >> strB;
	cout << calculateStringDistance(strA, strB);

	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章