【動態規劃】求最長公共子串,最長迴文子串
題目 : 給定兩個字串,求出它們之間連續的最長的相同子字串的長度。
eg : fbaabe,ebaabf,連續最長子串長度為4。
注意:求最長迴文子串也可以用求最長公共子串來求,只需將字串反轉作為另外一個字串,迴文部分反轉之後不變,然後求LCS(Longest common substring)即可。
求最長公共子串通常兩種方法:第一暴力,第二,動態規劃。這裡分別給出。
1. 暴力解法
char* lcs2(char* s1,char* s2)
{
int i,j;
char* shortstr,*longstr;
char* substr;
if (NULL == s1 || NULL == s2)
{
return NULL;
}
if (strlen(s1)<strlen(s2))
{
shortstr = s1;
longstr = s2;
}
else
{
shortstr = s2;
longstr = s1;
}
if (strstr(longstr,shortstr) != NULL)
{
return shortstr;
}
substr = (char *)malloc(sizeof(char)*(strlen(shortstr)-1));
for (i = strlen(shortstr)-1;i>0;i--)
{
for(j=0;j < strlen(shortstr);j++)
{
memcpy(substr,&shortstr[j],i);
substr[i] = '\0';
if (strstr(longstr,substr) != NULL)
{
return substr;
}
}
}
return NULL;
}
2. 動態規劃解
求字串str1,str2的最長公共子串的長度。
定義二元函式函式f(m,n):分別以str1[m],str2[n]結尾的連續公共子串的長度
而對於f(m+1,n+1) 有以下種情況:
1.str1[m+1] != str2[n+1],則有f(m+1,n+1) =0
2.str1[m+1] == str2[n+1],則有f(m+1,n+1) = f(m,n) + 1
另外,
f(0,j) = s1[0] == s2[j] ? 1:0 where (j>=0)
f(i,0) = s1[i] == s2[0] ? 1:0 where (j>=0)
按照上面這個公式,我們用容易寫出這個演算法的實現。
void commonstr(char* s1,char* s2)
{
int max,i,j,len1,len2,col,row,index;
row = len1 = strlen(s1); col = len2 = strlen(s2);
int *b = (int*)malloc(sizeof(int)*len1*len2); //二維陣列儲存以i,j結尾的字串長度
#define b(i,j) *(b+(i)*col + j)
/*memset(b,0,sizeof(int)*len1*len2);*/
for (i =0;i<len1;i++) //動歸初始條件
{
if (s1[i] == s2[0])
b(i,0) = 1;
else
b(i,0) = 0;
}
for (j=0;j<len2;j++)
{
if (s1[0] == s2[j])
b(0,j) = 1;
else
b(0,j) = 0;
}
max = 0;
for (i=1;i<len1;i++)
{
for (j=1;j<len2;j++)
{
if (s1[i] == s2[j])
{
b(i,j) = b(i-1,j-1) + 1;
max = b(i,j)>max ? b(i,j):0;
index = i+1;
}
else
{
b(i,j) = 0;
}
}
}
char* result = new char[len1+1];
strncpy(result,&s1[index-max],max);
result[max] = '\0';
cout << "最長子串長度:" << max <<endl;
cout << "最長子串:" << result << endl;
#undef b
delete[] b;
delete[] result;
}
相關推薦
【動態規劃】求最長公共子串,最長迴文子串
題目 : 給定兩個字串,求出它們之間連續的最長的相同子字串的長度。 eg : fbaabe,ebaabf,連續最長子串長度為4。 注意:求最長迴文子串也可以用求最長公共子串來求,只需將字串反轉作為另外一個字串,迴文部分反轉之後不變,然後求LCS(Longes
【動態規劃】求最長不下降序列
求最長不下降序列求最長不下降序列求最長不下降序列 Description 設有n(n<=1000)個不相同的整數(小於32767)組成的數列,記為: a1,a2,…,an,其中任意兩個數不相同。
【動態規劃】求一維子陣列的最大和
題目:輸入一個整形陣列,數組裡有正數也有負數。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。求所有子陣列的和的最大值。要求時間複雜度為O(n)。 例如,輸入的陣列為1, -2, 3,
【動態規劃】最長公共子序列問題
clas == 搜索 ios for 參考 pan 公式 是否 題目描述: 給定兩個字符串s1s2……sn和t1t2……tn。求出這兩個字符串最長的公共子序列的長度。字符串s1s2……sn的子序列指可以表示為si1si2……sim(i1<i2<……<im)
【動態規劃】最長公共子序列與最長公共子串
1. 問題描述 子串應該比較好理解,至於什麼是子序列,這裡給出一個例子:有兩個母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs與belong中都出現過並且出現順序與母串保持一致,我們將其稱為公共子序列。最長公共子序列(Longest Common Subsequence
【動態規劃】LCS演算法:求兩字串最大公共字串(連續)
LCS演算法的應用 問題描述:求兩字串的連續最大公共子字串 思路:根據上文LCS演算法求解兩字串的最大公共子序列(不連續),可以得到求解連續子字串的啟示,如圖所示,構造LCS矩陣vec,將兩個字串按矩
【動態規劃】NYOJ最長公共子序列
最長公共子序列 時間限制:3000 ms | 記憶體限制:65535 KB 難度:3 描述咱們就不拐彎抹角了,如題,需要你做的就是寫一個程式,得出最長公共子序列。 tip:最長公共子序
【動態規劃】--最長無重複子串
給定一個字串,找出不含有重複字元的最長子串的長度。 示例: 給定 "abcabcbb" ,沒有重複字元的最長子串是 "abc" ,那麼長度就是3。 給定 "bbbbb" ,最長的子串就是 "b" ,長度是1。 給定 "pwwkew" ,最長子串是 "wke" ,長度是3。請注
leetcode 矩陣中的最長遞增路徑 python【動態規劃】
題目描述 **分析:**假設最長路徑終點的是[i][j],則其最長路徑值為nums1[i][j],則nums1[i][j]等於它上下左右四個數中,比它小的數中最長路徑值最大的那一個+1 因此,我們可以從矩陣的最小值出發,其最長路徑值為1,然後計算第二小的數的最長路徑值,以此類推 cla
2017年A組藍橋杯(最大公共子串問題)【動態規劃】
最大公共子串長度問題就是:求兩個串的所有子串中能夠匹配上的最大長度是多少。比如:"abcdkkk" 和"baabcdadabc",可以找到的最長的公共子串是"abcd",所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分
【動態規劃】最大正方形 (洛谷 P1387 最大正方形)
代碼 log mar 最小 down 思路 計數 -m i++ 輸入格式: 輸入文件第一行為兩個整數n,m(1<=n,m<=100),接下來n行,每行m個數字,用空格隔開,0或1。 輸出格式: 一個整數,最大正方形的邊長。 輸入輸出樣例 輸入樣例: 4 4 0
算法52-----矩陣最小路徑【動態規劃】
sum data 列表 路徑 二次 解釋 示例 一行 lse 一、題目:矩陣最小路徑 給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。 示例: 輸入: [ [1,3,1],
算法56-----最小編輯代價【動態規劃】
狀態 tro 如果 for 字符串 技術 gin 給定 clas 一、題目:最小編輯代價 給定兩個字符串str1和str2,再給定三個整數ic,dc,rc,分別代表插入、刪除、替換一個字符的代價,返回將str1編輯成str2的最小代價。舉例:str1="abc" str
演算法56-----最小編輯代價【動態規劃】
一、題目:最小編輯代價 給定兩個字串str1和str2,再給定三個整數ic,dc,rc,分別代表插入、刪除、替換一個字元的代價,返回將str1編輯成str2的最小代價。舉例:str1="abc" str2="adc" ic=5 dc=3
【動態規劃】最小編輯距離(字串A到字串B變化最少要多少步)
最小編輯距離是一道非常經典的動態規劃問題。 設A 和B 是2 個字串。要用最少的字元操作將字串A 轉換為字串B。 這裡所說的字元操作包括 (1)刪除一個字元; (2)插入一個字元; (3)將一個字元改為另一個字元。 將字串A變換為字串B 所用的最少字元操作次數也稱
【動態規劃】最大子矩陣之和
最大子矩陣之和 題目描述 已知矩陣的大小定義為矩陣中所有元素的和。給定一個矩陣,你的任務是找到最大的非空(大小至少是11)子矩陣。 比如,如下44子矩陣 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 的最
【動態規劃】【最短路】[BZOJ 1003]物流運輸trans
簡直是醉了,這道題本來想了一會兒,然後看了看資料邊的數量頂天了才400然後時間最多才100那麼直接用SPFA 複雜度O(nm2)就可以過了,然後注意一下特別判定是否超過INF可能有資料很極限,判斷一下是
【動態規劃】數字三角形最大值(一)(遞迴)
題目:數字三角形,形如 3 3 2 4 5 1 1 3 4 1 每個點只能選擇向左或向右走,取一條路徑,使得路徑上數字和最大。 無需求出路徑,求出最大值。 輸入n,和 n 行數字三角形 n<
【動態規劃】UVa 1331 最大面積最小三角形剖分
題目 請點選 題目大意 將一個多邊形用它不相交的對角線將它分成若干個三角形,使得最大的三角形面積最小,求最大三角形的面積。如圖是一個六邊形的幾種剖分: 思路 記由點u,u+1,…,v-1,v(u< v)組成的多邊形為F(i,j) 首