7-2 最长公共子序列 (10 分)(思路加详解)
生活随笔
收集整理的這篇文章主要介紹了
7-2 最长公共子序列 (10 分)(思路加详解)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一:題目
給定兩個(gè)長(zhǎng)度分別為N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串長(zhǎng)度最長(zhǎng)是多少。
輸入格式:
第一行包含兩個(gè)整數(shù)N和M。1≤N,M≤1000
第二行包含一個(gè)長(zhǎng)度為N的字符串,表示字符串A。
第三行包含一個(gè)長(zhǎng)度為M的字符串,表示字符串B。
字符串均由小寫字母構(gòu)成。
輸出格式:
輸出一個(gè)整數(shù),表示最大長(zhǎng)度。
輸入樣例:
4 5 acbd abcbd輸出樣例:
4二:思路
區(qū)分:最長(zhǎng)公共子序列和最長(zhǎng)公共子串
舉例:str1:abcd; str2:abecd
最長(zhǎng)公共子序列: abcd
最長(zhǎng)公共子串:ab
思路:思路來源于 《算法圖解》 一書,主要是將問題轉(zhuǎn)化成方格的形式(可以用二維數(shù)組進(jìn)行表示)
橫縱分別為兩個(gè)字符串 那么在比較的時(shí)候,
如果兩個(gè)字符相同,則將其所對(duì)應(yīng)的坐標(biāo)所代表的值為 左上方坐標(biāo)的值加一
如果兩個(gè)字符不相同,則選擇其上方和左方中最大的值來代表
三:上碼
/*區(qū)分:最長(zhǎng)公共子序列和最長(zhǎng)公共子串舉例:str1:abcd; str2:abecd 最長(zhǎng)公共子序列: abcd最長(zhǎng)公共子串:ab 思路:思路來源于 《算法圖解》 一書,主要是將問題轉(zhuǎn)化成方格的形式(可以用二維數(shù)組進(jìn)行表示)橫縱分別為兩個(gè)字符串 那么在比較的時(shí)候,如果兩個(gè)字符相同,則將其所對(duì)應(yīng)的坐標(biāo)所代表的值為 左上方坐標(biāo)的值加一如果兩個(gè)字符不相同,則選擇其上方和左方中最大的值來代表 */#include<bits/stdc++.h> using namespace std;int main(){int N,M;string str1,str2;cin >> N >> M;cin >> str1 >> str2;int m[N+1][M+1];for(int i = 0; i < N + 1; i++){for(int j = 0; j < M + 1; j++){m[i][j] = 0;}}// cout << m[0][0];for(int i = 0; i < N; i++){for(int j = 0; j < M; j++){//如果該兩個(gè)字符相等 那么的話 該坐標(biāo)對(duì)應(yīng)的值為左上方的值加一 if(str1[i] == str2[j] ){m[i+1][j+1] = m[i][j] + 1;}else{//如果不相等那么就選擇左方(行不變,列減一)或者上方(行減一,列不變 )中較大的值 m[i+1][j+1] = m[i+1][j] > m[i][j+1] ? m[i+1][j] : m[i][j+1]; } }}//網(wǎng)格中的最后位置為 公共子序列的長(zhǎng)度 cout << m[N][M];}//4 4 //fosh //fish總結(jié)
以上是生活随笔為你收集整理的7-2 最长公共子序列 (10 分)(思路加详解)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 13999 元,三星 Galaxy Z
- 下一篇: 7-6 0-1背包 (20 分)(思路加