我正在学习最长公共子序列,使用以下算法:
公共级LCS{
static int[][] E;
static int[][] S;
static int D;
static int T;
static int L;
public static void LCS_cost(String X,String Y)
{
int m = X.length();
int n = Y.length();
E = new int[m][n];
S = new int[m][n];
for(int i=0;i<m;i++){
E[i][0] = 0;
}
for(int j=0;j<n;j++){
E[0][j] = 0;
}
for(int i=1;i<m+1;i++){
for(int j=1;j<n+1;j++){
if(X.charAt(i) == Y.charAt(j)){
E[i][j] = E[i-1][j-1]+1;
D = E[i-1][j-1]+1;
S[i][j] = D;//Diagonal Direction
}
else if (E[i-1][j]>=E[i][j-1]){
E[i][j] = E[i-1][j];
T = E[i-1][j];
S[i][j] = T;//TOP
}
else
E[i][j] = E[i][j-1];
L = E[i][j-1];
S[i][j] = L;//Left
}
}
}
public static void Backtrack(int[][] S,String X,String Y){
int row = X.length();
int col = Y.length();
while (row > 0 || col > 0){
if (S[row][col] == D){
System.out.print(X.charAt(row));
row--;
col--;
}
else if (S[row][col] == T){
row--;
}
else
col--;
}
}
public static void main(String[] args) {
new LCS();
LCS_cost("SCHOOL","SPOOL");
Backtrack(S,"SCHOOL", "SPOOL");
}
}
但是程序返回一个ErrorCharAt(未知来源),并且没有做任何事情。
for(int i=1;i<m+1;i++){
for(int j=1;j<n+1;j++){
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if (S[row][col] == D){
....
}
另外,如果我将int i和j更改为0,那么下面的E将是索引-1和错误
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(X.charAt(i) == Y.charAt(j)){
E[i][j] = E[i-1][i-1]+1;
......
}
我现在很迷路。有人能帮我吗?
我会使用字符串而不是处理单个字符:
String findLCS(String str1, String str2) {
int longest = 0;
String longestSubstring = "";
for (int i=0; i < str1.length(); ++i) {
for (int j=i+1; j <= str1.length(); ++j) {
String substring = str1.substring(i, j);
if (str2.contains(substring) && substring.length() > longest) {
longest = substring.length();
longestSubstring = substring;
}
}
}
return longestSubstring;
}
正如您所看到的,使用string.contains()
比看起来更强大。
然而,我意识到我真正想解决的问题有点不同。给定一个固定的k,我需要确保公共子序列只涉及长度正好为k的子串。例如,设置k=2,并让这两个字符串为 我需要的子序列是“。 是否可以修改动态规划解来解决这个问题?
本文向大家介绍手写代码:两个字符串的最长公共子序列?相关面试题,主要包含被问及手写代码:两个字符串的最长公共子序列?时的应答技巧和注意事项,需要的朋友参考一下 参考回答:
一个序列中去掉若干(也可以不去掉)元素剩下的部分称为其子序列。对于给定的序列X = <x1,x2,…,xm>,称序列Z = <z1,z2,…,zk>为X的一个子序列,仅当在X中存在一个递增序号序列<i1,i2,…,ik>,对所有的j(1,2,…,k)满足 xij= z j。例如,Z = <a,b,f,c>是X = <a,b,c,f,b,c> 的一个子序列,X中相应的序号序列为 <1,2,4,6>
问题内容: 我正在寻找一个Python库,用于从 一组字符串中 找到最长的公共子 字符串 。有两种方法可以解决此问题: 使用后缀树 使用动态编程。 实施的方法并不重要。重要的是,它可以用于 一组字符串 (不仅是两个字符串)。 问题答案: 这些成对的函数将在任意字符串数组中找到最长的公共字符串: 毫无疑问,该算法可以得到改进,而且我对Python的接触也很少,因此也许它在语法上也可能更有效,但是它应
问题内容: 提出一个最优雅的JavaScript,Ruby或其他解决方案来解决一个相对琐碎的问题是一个挑战。 这个问题是Longest common substring问题的 一个更具体的情况。我只需要找到数组中最长的公共 起始 子串。这大大简化了问题。 例如,最长的子字符串是“ inters”。但是,我不需要在中找到“有意义” 。 我已经通过用JavaScript快速编写一个解决方案来解决该问题
本文向大家介绍Python求两个字符串最长公共子序列代码实例,包括了Python求两个字符串最长公共子序列代码实例的使用技巧和注意事项,需要的朋友参考一下 一、问题描述 给定两个字符串,求解这两个字符串的最长公共子序列(Longest Common Sequence)。比如字符串1:BDCABA;字符串2:ABCBDAB。则这两个字符串的最长公共子序列长度为4,最长公共子序列是:BCBA 二、算法