두 개의 문자열 A와 B 사이에 가장 긴 공통 부분 시퀀스의 수를 찾아야합니다. 현재 일반적인 동적 프로그래밍 방식을 사용하고 있고 백 트랙 배열을 사용하여 모든 고유 부분 문자열을 생성 한 다음 시작 인덱스에서 깊이 우선 검색을 수행합니다.가장 긴 공통 부분 시퀀스 번호
그러나 가능한 답변 수가 너무 많기 때문에 코드가 너무 느립니다. 그러한 고유 한 가장 긴 공통 서브 시퀀스의 수를 실제로 생성하지 않고 계산하는 방법이 있습니까? 지금까지
내 코드 : 어쩌면 트라이의 종류를 사용하여
이import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Stack;
class Node
{
String res = "";
int i;
int j;
public Node(int _i, int _j, String s)
{
i = _i;
j = _j;
res = s;
}
}
public class LCSRevisited
{
static String a;
static String b;
static int m,n;
static int[][] memo;
static int[][] bt; // 1 means [i+1][j], 2 means [i][j+1], 3 means [i+1][j+1]
// 4 - means both
static HashSet <String> filter;
static void printAllStrings()
{
Iterator i = filter.iterator();
while(i.hasNext())
{
System.out.println(i.next());
}
}
static void printSol()
{
System.out.print(memo[ 0 ][ 0 ]);
// check how many UNIQUE such strings exist
filter = new HashSet();
Stack<Node> s = new Stack();
Node start = new Node(0, 0, "");
s.push(start);
Node curr;
String res;
// use backtrack array to do a DFS
while(!s.isEmpty())
{
curr = s.pop();
res = curr.res;
if((curr.i>=m) || (curr.j >=n))
{
filter.add(curr.res);
continue;
}
// check backtrack value
int i = curr.i;
int j = curr.j;
int back = bt[ i ][ j];
if(back == 1)
{
s.push(new Node(i+1, j, res));
}
if(back == 2)
{
s.push(new Node(i, j+1, res));
}
if(back == 3)
{
s.push(new Node(i+1, j+1, res+a.charAt(i)));
}
if(back == 4)
{
s.push(new Node(i, j+1, res));
s.push(new Node(i+1, j, res));
}
}
//printAllStrings();
System.out.println(" " + filter.size());
}
static void solve()
{
// fill base cases
m = a.length();
n = b.length();
memo = new int[ m+1 ][ n+1 ];
Arrays.fill(memo[m], 0);
bt = new int[ m+1 ][ n+1 ];
for(int i=0; i<m; i++)
{
memo[ i ][ n ] = 0;
}
// Now compute memo values
for(int i=m-1; i>=0; i--)
{
for(int j=n-1; j>=0; j--)
{
if(a.charAt(i) == b.charAt(j))
{
memo[ i ][ j ] = 1 + memo[ i+1 ][ j+1 ];
bt[ i ][ j ] = 3;
}
else
{
int r1 = memo[ i+1 ][ j ];
int r2 = memo[ i ][ j+1 ];
if(r1==r2)
{
memo[ i ][ j ] = r1;
bt[ i ][ j ] = 4;
}
else if(r1 > r2)
{
memo[ i ][ j ] = r1;
bt[ i ][ j ] = 1;
}
else
{
memo[ i ][ j ] = r2;
bt[ i ][ j ] = 2;
}
}
}
}
printSol();
}
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T= Integer.parseInt(br.readLine());
while(T--> 0)
{
a = br.readLine();
b = br.readLine();
if(T>=1)
br.readLine();
solve();
// printArr(bt);
}
}
}
별개의 단어는 동일하지 않거나 다른 위치에 있다는 뜻입니까? "aaa"와 "abababa"사이에 얼마나 많은 "별개의"LCS가 있습니까? – aelguindy
별개로, 나는 평등하지 않다. "aaa"와 "abababa"는 그 사이에 하나의 가장 긴 공통 서브 시퀀스를 가지고 있습니다 - "aaa" – arya