재귀 대신 동적 프로그래밍을 사용하여 가장 큰 공통 접미사(자바스크립트) 찾기 (Use dynamic programming instead of recursion to find largest common suffix (javascript))


문제 설명

재귀 대신 동적 프로그래밍을 사용하여 가장 큰 공통 접미사(자바스크립트) 찾기 (Use dynamic programming instead of recursion to find largest common suffix (javascript))

두 문자열의 가장 큰 공통 접미사를 찾는 재귀 솔루션을 찾았습니다. 이것을 동적 프로그래밍 솔루션으로 어떻게 변환할 수 있습니까? 접미사는 두 문자열의 끝에서 비교하는 것이 가장 쉽기 때문에 상향식 솔루션을 개념화하기가 어렵습니다. 솔루션을 시도했지만 나에게 하향식인 것 같습니다.

ATTEMPT

var LCSuffDyn = function(X,Y) {
    longest_suffix = [''];
    var largest_string, smallest_string;
    if (X.length > Y.length) {
        largest_string = X;
        smallest_string = Y;
    } else {
        largest_string = Y;
        smallest_string = X;
    }

    for (var k=1; k<smallest_string.length; k++) {
        if (X[X.length‑k] === Y[Y.length‑k]) {
            longest_suffix[k] = X[X.length‑k]+longest_suffix[k‑1];
        }
        else break;
    }

    return longest_suffix[longest_suffix.length‑1];
};
console.log(LCSuffDyn('cbbbbbbbbbbajlbbbbbbbaba', 'cajkbbbbbbbbbjklbaba'));

RECURSIVE

var LCSuffRec = function(X,Y) {
    return rec(X,Y, X.length, Y.length);
    function rec(X, Y, m, n) {
        if (X[m‑1] === Y[n‑1]) return rec(X, Y, m‑1, n‑1) + X[m‑1];
        else return '';
    }
};

참조 솔루션

방법 1:

Try like this

    function LCSuffDyn( X, Y ) {
    var result = "";
    var indexX = X.length ‑ 1;
    var indexY = Y.length ‑ 1;
    var endIt = false;
    while( indexX >= 0 && indexY >= 0 && !endIt ) {
        if( X.substr( indexX, 1 ) == Y.substr( indexY, 1 ) ) {
            result = X.substr( indexX, 1 ) + result;
        } else {
            endIt = true;
        }
        indexX ‑‑;
        indexY ‑‑;
    }
    return result;
}

DEMO HERE

(by Daniel KobeRiccardoC)

참조 문서

  1. Use dynamic programming instead of recursion to find largest common suffix (javascript) (CC BY‑SA 2.5/3.0/4.0)

#dynamic-programming #string #recursion #javascript #suffix






관련 질문

나머지 숫자의 xor가 0인 부분 집합의 수를 찾습니다. (Find number of subsets, that xor of remaining numbers equals to 0)

재귀 대신 동적 프로그래밍을 사용하여 가장 큰 공통 접미사(자바스크립트) 찾기 (Use dynamic programming instead of recursion to find largest common suffix (javascript))

제거 방법 : java.lang.OutOfMemoryError (how to remove : java.lang.OutOfMemoryError)

가장 효율적인 좌석 배치 (Most efficient seating arrangement)

aglorithm의 복잡성을 가진 춤 (A dance with an aglorithm's complexity)

장애물이 있는 처음부터 끝까지 경로의 수를 계산합니다. (Count the number of paths from start to end with obstacles)

직사각형 필드 내에서 다양한 크기의 직사각형을 효율적으로 배치 (Efficient placement of variable size rectangles within a rectangular field)

기차 또는 버스를 이용할 수 있는 도시 간 최단 경로 DYNAMIC PROGRAMMING (Shortest path between cities that you can use either train or bus DYNAMIC PROGRAMMING)

인덱스가 오름차순으로 정렬되도록 주어진 합계를 갖는 하위 배열의 개수 (Count of sub-arrays with a given sum such that the indices are in ascending order)

2차원 배열의 경로 수 계산(그리드 Traveller) (Count number of paths on 2d-array (grid Traveller))

n개의 볼과 m개의 빈이 주어지고 각 빈이 특정 용량을 가질 때, 몇 개의 조합이 있습니까? (Given n balls and m bins, each bin with a certain capacity, how many combinations are there?)

재귀 호출을 메모할 때 엄청난 효율성 차이 (Drastic efficiency difference when memoizing recursive calls)







코멘트