題目:計算字符串的相似度
描述 |
對於不同的字符串,我們希望能有辦法判斷相似程度,我們定義了一套操作方法來把兩個不相同的字符串變得相同,具體的操作方法如下: 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;
}