對於長度相同的2個字串a和b,其距離定義為相應位置字元距離之和。2個非空格字元的距離是它們的ascii碼之差的絕對值;空格與空格的距離為0,空格與其他字元的距離為乙個定值k。在一般情況下,字串a和b的長度不一定相同。字串a的擴充套件是在a中插入若干空格字元所產生的字串。在字串a和b的所有長度相同的擴充套件中,有一對距離最短的擴充套件,該距離稱為字串a和b的擴充套件距離。對於給定的字串a和b,設計乙個演算法,計算其擴充套件距離。
測試資料:
輸入:cmc snmn 2 (分別表示字串a、b和定值k)
輸出:10
解釋:c_ _ m _ c 從左到右每位差 2 2 2 0 2 2 ,一共10.
_s n m n _
設字串a和b的字串a[1…i]和b[1…j]的擴充套件距離是val(i, j);
依題意,字串a和b有三種可能的情況:
1)i 和空格匹配。則val(i, j) = val(i-1, j) + k;
2)j 和空格匹配。則val(i, j) = val(i, j-1) + k;
3)擴充套件距離val(i-1,j-1)加上 i,j 的字元距離。則val(i, j) = val(i-1, j-1) + dist(ai , bi);
由上可知,val(i, j)具有最優子結構性質,且滿足如下遞推式:
val(i, j) = min
最終即求解**dp[len1][len2]
**,len1 len2為兩個字串的長度。
(使用動態規劃演算法,自底向上的計算各個子問題並利用每次計算的結果,避免重複運算,從而降低演算法複雜度。)
從動態規劃遞迴式可知,演算法的時間複雜度為o(mn),m和n分別是字串a和b的長度。
#include
#include
#include
using
namespace std;
string a,b;
intdist
(int i,
int j)
//返回a中第i個字元 b中第j個字元的acsii值之差
intmain()
動態規劃 計算字串編輯距離
題目 設a 和b 是2 個字串。要用最少的字元操作將字串a 轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b 所用的最少字元運算元稱為字串a到b 的編輯距離,記為d a,b 試設計乙個有效演算法,對任給的2 個字串a和b,計...
動態規劃 計算字串之間的距離
levenshtein 距離,又稱編輯距離,指的是兩個字串之間,由乙個轉換成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。編輯距離的演算法是首先由 科學家levenshtein提出的,故又叫levenshtein distance。字串a a...
動態規劃 字串相似度 編輯距離問題 java
二 字串相似度 編輯距離 edit distance 對於序列s和t,它們之間距離定義為 對二者其一進行幾次以下的操作 1 刪去乙個字元 2 插入乙個字元 3 改變乙個字元 每進行一次操作,計數增加1。將s和t變為同乙個字串的最小計數即為它們的距離。給出相應演算法。問題分析 這個問題就不像硬幣找零問...