最長公共子串行的問題

2021-08-11 02:57:11 字數 1245 閱讀 7018

給定兩個字串str1和str2,返回兩個字串的最長公共子串行。

舉例str1=」1a2c3d4b56」,str=「b1d23ca45b6a」。123456或者12c4b6都是最長公共子串行,返回哪乙個都行。

此題可以採用動態規劃的思想來解。首先要構造乙個矩陣matrix[str1.length()][str2.length()]。以str1為行,str2為列。之後構造陣列dp[str1.length()][str2.length()]用於記錄最長匹配字串的長度。首先要算出dp[0][0]的值之後算出第一行或者是第一列的dp值。dp[0][0]的值通過以下公式計算:

dp[0][0] = str1.charat(0) == str2.charat(0)?1:0;
之後計算第一列的最長公共序列的長度,實質上就是比較str2[0]與str1[0~i-1]。若str2[0]與某一項str1[x]相等則設dp[x][0]為1.之後的dp[i+1~str1.length()-1]均為1.因為比較的是str2[0],長度最大為1.列上的同理。

之後要解決i,j大於等於1上的資料了。需要考慮三種情況:

public

int solution(string str1,string str2)

dp[0][0] = str1.charat(0) == str2.charat(0)?1:0;

for(int i=1;i0] = math.max(dp[i-1][0], str1.charat(i) == str2.charat(0)?1:0);

}for(int j=1;j0][j] = math.max(dp[0][j-1], str1.charat(0) == str2.charat(j) ?1:0);

}for(int i=1;ifor(int j=1;j1][j], dp[i][j-1]);

if(str1.charat(i) == str2.charat(j))}}

return dp;

}public

static

void

main(string args) else

if(n>0 && dp[m][n] == dp[m][n-1])else

}system.out.println(string.valueof(res));

} catch (instantiationexception e) catch (illegalacces***ception e)

}

最長公共子串行問題

給定整數a1,a2,an 可能有負值 求連續子串行和的最大值。為方便起見,如果所有整數都為負值,則最大子串行和為0 這是個顯而易見的方法,幾乎每個人在第一眼看到該問題都能夠想出來的方法。就是將所有的子串行找出來,然後求和最大的乙個。如果序列足夠大,該方法的效率可想而知。如下 include incl...

最長公共子串行問題

最長公共子串行問題很早就在很多論壇上見過,前幾天看到乙個人發了一篇帖子,心血來潮就去看演算法導論上的動態規劃部分,關於這個問題不再細述,直接貼c 實現的具體 了。做大公共子串行問題 pragma once include using std string define over 1 書中使用箭頭符號...

最長公共子串行問題

問題描述 字串行的子串行是指從給定字串行中隨意地 不一定連續 去掉若干個字元 可能乙個也不去掉 後所形成的字串行。令給定的字串行x x0,x1,xm 1 序列y y0,y1,yk 1 是x的子串行,存在x的乙個嚴格遞增下標序列,使得對所有的j 0,1,k 1,有xij yj。例如,x abcbdab...