題目:對於兩個字串,請設計乙個高效演算法,求他們的最長公共子串行的長度,這裡的最長公共子串行定義為有兩個序列u1,u2,u3...un和v1,v2,v3...vn,其中ui給定兩個字串a和b,同時給定兩個串的長度n和m,請返回最長公共子串行的長度。保證兩串長度均小於等於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。
給定兩個字串a和b,同時給定兩串的長度n和m。
樣例:
"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,b和c,及他們的長度。請返回乙個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...