문자열이 주어지면 각 하위 문자열에 N 개 이하이지만 M 개 문자보다 작지 않은 모든 가능한 하위 문자열 배열을 생성하는 방법은 무엇입니까?

서정적으로 사악한

나는 문자열 str과 두 개의 양의 정수를 가지고 M있으며 N, 여기서는 M보다 작거나 같을 수 N있습니다. 내가 원하는 것은 각 부분이 N문자 보다 많지 않고 M문자 보다 작지 않도록 문자열을 분할하는 것입니다 (문자열 의 길이가보다 크다고 가정하고, M이보다 크지 않으면 다음 과 같다고 N가정 할 수 있습니다) N. 문자열의 길이). 예를 들어, 경우 M=1, N=3내 캐릭터는 "aabcde", 결과는해야한다

var str = "aabcde";
var result = [
["a", "a", "b", "cde"],
["a", "ab", "cde"],
["aa", "b", "cde"],
//...
["aab", "cde"],
["aab", "cd", "e"],
["aab", "c", "de"],
["aab", "c", "d", "e"]  
]

불필요한 중간 부분 배열을 피하면서 이것을 해결하는 효율적인 방법은 무엇입니까? 가능한 모든 조합을 생성하고 허용 할 수없는 길이의 하위 문자열이 하나 이상 포함 된 경우 각 하위 배열을 삭제하고 싶지 않습니다. 불필요한 계산없이 다른 방법이 있습니까?

게으른 개

이것은 두 값 사이의 부분으로 제한된 정수 구성 을 생성하는 것으로 효과적으로 귀결됩니다 . 이러한 구성을 재귀 적으로 생성하는 것은 간단한 문제입니다.MN

또한 예에서 "aabcde", M=1, N=3"배열 길이가 모두 길이보다 작거나 같음을 확인 4했으므로 각 구성의 부품 수를 제한하는 선택적 매개 변수도 포함했습니다.

function* restrictedCompositions(n, a, b, k = n) {
    if (!(0 < a && a <= b && b <= n && 0 < k && k <= n)) {
        throw "invalid arguments";
    }

    let C = [];

    function* recGen(m, r) {
        if (m == 0) {
            yield C; // client must copy if they wish to store value for later
        }
        else {
            let y = Math.min(b, m);
            let x = Math.max(a, m - y*(r - 1));

            for (let v = x; v <= y; v++) {
                C.push(v);
                yield* recGen(m - v, r - 1);
                C.pop();
            }
        }   
    }

    yield* recGen(n, k);
}

function* generateChoppedStrings(str, M, N, K = str.length) {
    for (let composition of restrictedCompositions(str.length, M, N, K)) {
        let chopped = [];
        let i = 0;

        for (let part of composition) {
            let j = i + part;
            chopped.push(str.slice(i, j));
            i = j;
        }

        yield chopped;
    }
}

function chopString(str, M, N, K = str.length) {
    for (let chopped of generateChoppedStrings(str, M, N, K)) {
        console.log(chopped);
    }
}

chopString("aabcde", 1, 3, 4);

산출:

["a", "a", "b", "cde"]
["a", "a", "bc", "de"]
["a", "a", "bcd", "e"]
["a", "ab", "c", "de"]
["a", "ab", "cd", "e"]
["a", "ab", "cde"]
["a", "abc", "d", "e"]
["a", "abc", "de"]
["aa", "b", "c", "de"]
["aa", "b", "cd", "e"]
["aa", "b", "cde"]
["aa", "bc", "d", "e"]
["aa", "bc", "de"]
["aa", "bcd", "e"]
["aab", "c", "d", "e"]
["aab", "c", "de"]
["aab", "cd", "e"]
["aab", "cde"]

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관