計算字符串的類似度

問題描述編程

對於給定的兩個字符串,能夠進行增長、減小或者修改一個字符的方式使一個字符串等於另外一個字符串,把須要操做的次數定義爲兩個字符串的距離,類似度等於「距離+1」的倒數。spa


分析求解code

兩個字符串A和B,下標範圍爲[aBegin,aEnd]和[bBegin,bEnd]字符串

若是第一個字符相等,則不做處理,只需計算A[2,aEnd]和B[2,bEnd]的距離class

若是不相等,能夠作如下處理書籍

  1. 刪除A的第一個字符,而後計算A[2,aEnd]和B[1,bEnd]的距離。co

  2. 刪除B的第一個字符,而後計算A[1,aEnd]和B[2,bEnd]的距離。字符

  3. 修改A的第一個字符爲B的第一個字符,而後計算A[2,aEnd]和B[2,bEnd]的距離。return

  4. 修改B的第一個字符爲A的第一個字符,而後計算A[2,aEnd]和B[2,bEnd]的距離。

  5. 添加A的第一個字符到B的第一個字符以前,而後計算A[2,aEnd]和B[1,bEnd]的距離。

  6. 添加B的第一個字符到A的第一個字符以前,而後計算A[1,aEnd]和B[2,bEnd]的距離。

可是咱們最終關注的問題是怎樣求得兩個字符串的距離,也就是說咱們只要知道經過一步操做就能夠將問題簡化成規模更小的問題就能夠,沒有必要實施這個操做。

那麼上面6個操做就能夠合併爲下面3個操做

  1. 一步操做以後,再處理A[1,aEnd]和B[2,bEnd]。

  2. 一步操做以後,再處理A[2,aEnd]和B[1,bEnd]。

  3. 一步操做以後,再處理A[2,aEnd]和B[2,bEnd]。

代碼實現

//*End表明的是要比較的字符串的最後一個字符的下一個位置
int calculate(char *strA, int aBegin, int aEnd, char *strB, int bBegin, int bEnd)
{
	if(aBegin>=aEnd)
	{
		if(bBegin>=bEnd)
			return 0;
		else 
			return bEnd-bBegin;
	}

	if(bBegin>=bEnd)
	{
		if(aBegin>=aEnd)
			return 0;
		else 
			return aEnd-aBegin;
	}

	if(strA[aBegin]==strB[bBegin])
	{
		return calculate(strA,aBegin+1,aEnd,strB,bBegin+1,bEnd);
	}
	else
	{
		int n1 = calculate(strA,aBegin+1,aEnd,strB,bBegin,bEnd);
		int n2 = calculate(strA,aBegin,aEnd,strB,bBegin+1,bEnd);
		int n3 = calculate(strA,aBegin+1,aEnd,strB,bBegin+1,bEnd);
		
		//求最小值+1
		return min(n1,n2,n3) + 1;
	}
}


參考書籍:《編程之美》

相關文章
相關標籤/搜索