最全的最長公共子串行 最長公共子串的不同題型

2021-08-23 12:29:18 字數 3366 閱讀 7099

題目:對於兩個字串,請設計乙個高效演算法,求他們的最長公共子串行的長度,這裡的最長公共子串行定義為有兩個序列u1,u2,u3...un和v1,v2,v3...vn,其中ui給定兩個字串ab,同時給定兩個串的長度nm,請返回最長公共子串行的長度。保證兩串長度均小於等於300。

樣例:

"1a2c3d4b56",10,"b1d23ca45b6a",12

返回:

解析:求不連續的公共子串行的長度,o(n2)

dp[ i ][ j ] 為a的0 - i 的子串與b的0 - i 的子串的最大公共子串行長度

// 最長公共子串行,動規,o(n2)

public static int findlcs(string a, string b) else }}

return dp[n][m];

}

同上,回溯列印。​​​​​​​

// 列印最長公共子串行,動規,o(n2)

public static string findlcs2(string a, string b) else }}

int i = n;

int j = m;

int k = 0;

while (dp[i][j] > 0)

}for (i = k - 1; i >= 0; i--)

return ret.tostring();

}

題目:對於兩個字串,請設計乙個時間複雜度為o(m*n)的演算法(這裡的m和n為兩串的長度),求出兩串的最長公共子串的長度。這裡的最長公共子串的定義為兩個序列u1,u2,..un和v1,v2,...vn,其中ui + 1 == ui+1,vi + 1 == vi+1,同時ui == vi。

給定兩個字串ab,同時給定兩串的長度nm

樣例:

"1ab2345cd",9,"12345ef",7
返回:4

解析:求連續的公共子串的長度,o(n2)

dp[ i ][ j ] 為a的以 i 結尾的和子串與b的以 j 結尾的子串最大公共子串長度

// 最長公共子串,動規,o(n2)

public int findlongest(string a, string b) else

max = math.max(dp[i][j], max);}}

} return max;

}

例子同上,稍作修改便可:記錄最大連續結尾位置

/ 列印最長公共子串,動規,o(n2)

public static string findlongest2(string a, string b) else

if (max < dp[i][j]) }}

} string result = a.substring(index_i - max + 1, index_i + 1);

return result;

}5.a串變為

題目:對於兩個字串a和b,我們需要進行插入、刪除和修改操作將a串變為b串,定義c0,c1,c2分別為三種操作的代價,請設計乙個高效演算法,求出將a串變為b串所需要的最少代價。

給定兩個字串a和b,及它們的長度和三種操作代價,請返回將a串變為b串所需要的最小代價。保證兩串長度均小於等於300,且三種代價值均小於等於100。

樣例:

"abc",3,"adc",3,5,3,100

返回:8

解析:

dp[i][j]表示a[0..i-1]變到b[0..j-1]需要的最小代價

長度為i的a修改為長度為j的b可以分為:

1、長度為i的a修改為長度為j-1的b,然後插入j位置的字元;

2、長度為i-1的a修改為長度為j的b,然後刪除i位置的字元;

3、長度為i-1的a修改為長度為j-1的b,然後i位置的字元修改為j位置的字元。

public static int str1tostr2(string a, string b, int c0, int c1, int c2) 

for (int j = 1; j < m + 1; j++)

for (int i = 1; i < n + 1; i++) else

}} return dp[n][m];

}6.由兩個字

題目:對於三個字串a,b,c。我們稱c由a和b交錯組成當且僅當c包含且僅包含a,b中所有字元,且對應的順序不改變。請編寫乙個高效演算法,判斷c串是否由a和b交錯組成。

給定三個字串a,bc,及他們的長度。請返回乙個bool值,代表c是否由a和b交錯組成。保證三個串的長度均小於等於100。

樣例:

"abc",3,"12c",3,"a12bcc",6

返回:true

解析:判斷c串是否由a和b交錯組成。

dp[ i ][ j ] : a的前個字元與b的前j個字元是否與c的第前i+j-1個字元匹配

public static boolean chkmixture(string a, string b, string c) 

boolean dp = new boolean[n + 1][m + 1];// a的前個字元與b的前j個字元是否與c的第前i+j-1個字元匹配

dp[0][0] = true;

for (int i = 1; i <= n; i++) else

} for (int j = 1; j <= m; j++) else

} for (int i = 1; i < n + 1; i++)

if (dp[i][j - 1] && b[j - 1] == c[i + j - 1])

}} return dp[n][m];

}

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...

最長公共子串 最長公共子串行

子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...