Java 查找最长公共子序列:我的方法
我试图实现2个字符串的最长公共子序列。我的方法和这里贴的有点不同。 我接近解决方案,但问题不大。请帮帮我 我的问题是: 所需输出:metallica 电流输出:etallica 我的代码是:Java 查找最长公共子序列:我的方法,java,string,longest-substring,Java,String,Longest Substring,我试图实现2个字符串的最长公共子序列。我的方法和这里贴的有点不同。 我接近解决方案,但问题不大。请帮帮我 我的问题是: 所需输出:metallica 电流输出:etallica 我的代码是: import java.util.ArrayList; import java.util.Stack; public class CommonSubS { public static void main(String[] args) { ArrayList<Character> s
import java.util.ArrayList;
import java.util.Stack;
public class CommonSubS {
public static void main(String[] args) {
ArrayList<Character> ss = new ArrayList<>();
String s1 = "metallicarules";
String s2 = "rulmetallicales";
ArrayList<ArrayList<Character>> one = new ArrayList<>();
char[] first = s1.toCharArray();
char[] second = s2.toCharArray();
int j = 0;
int current = 0;
int mainIndex = 0;
ArrayList<Character> sec = new ArrayList<>();
// search for each char in second
for(int i = 0; i<second.length; i++)
{
j = current;
// search for each char in first
while(j<first.length)
{
// if match found, add to the arraylist
if(first[j] == second[i]){
sec.add(first[j]);
current = j+1;
break;
}
else
{ // if different char occured in between,
// save current arraylist in one
// and go forward
one.add(sec);
sec = new ArrayList<>();
j++;
current = 0;
}
}
}
for(ArrayList<Character> s: one)
{
for(Character c: s)
{
System.out.print(c);
}
System.out.println();
}
}
}
/*
desired output: metallica
current output: etallica
*/
import java.util.ArrayList;
导入java.util.Stack;
公共类公共资源{
公共静态void main(字符串[]args){
ArrayList ss=新的ArrayList();
字符串s1=“metallicarules”;
字符串s2=“rulmetallicales”;
ArrayList one=新的ArrayList();
char[]first=s1.toCharArray();
char[]second=s2.toCharArray();
int j=0;
int电流=0;
int main index=0;
ArrayList sec=新的ArrayList();
//在一秒钟内搜索每个字符
对于(int i=0;i我仍然不能确切地确定您的算法是如何工作的,但我认为j
的值过快变得太大。我更改了else
块,每次将j
重置为0,代码现在生成所需的“metallica”输出
else
{//如果两个字符之间出现不同的字符,
//将当前arraylist保存在一个
//继续前进
一.增加(第二节);
sec=新的ArrayList();
j=0;//从字符串的开头开始检查
电流=0;
break;//这将退出while循环并转到i的下一个值
}
我认为问题在于你的I递增,并将第二个单词的metallica中的m与第一个单词的最后一个e进行比较,因此下一次迭代将从下一个字母开始,即(第二个单词的)e,这就是为什么你在开始时没有得到m。也许如果你每次结束一个公共子序列时都使用i=i-1。请指出问题所在?你应该问你所面临的问题。我刚刚编辑了这篇文章。你的问题是什么?我刚刚编辑了它。我的两个字符串是“metallicarules”和“rulmetallicales”。我需要输出为metallica。相反,我得到的是etallica。你的ss
和mainIndex
变量是干什么用的?它们似乎什么都没有做。总之,我在for循环的开始处设置current=0。所以当这个else循环执行时,j无论如何都是0。我想我在某个地方缺少了1个索引。是的。那是谢谢,非常感谢。
else
{ // if different char occured in between,
// save current arraylist in one
// and go forward
one.add(sec);
sec = new ArrayList<>();
j = 0; // Start checking from the beginning of the string
current = 0;
break; // This will exit the while loop and move on to the next value of i
}