Java 查找最长公共子序列:我的方法

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

我试图实现2个字符串的最长公共子序列。我的方法和这里贴的有点不同。 我接近解决方案,但问题不大。请帮帮我

我的问题是: 所需输出:metallica 电流输出:etallica

我的代码是:

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
           }