나는 문자열 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"]
]
불필요한 중간 부분 배열을 피하면서 이것을 해결하는 효율적인 방법은 무엇입니까? 가능한 모든 조합을 생성하고 허용 할 수없는 길이의 하위 문자열이 하나 이상 포함 된 경우 각 하위 배열을 삭제하고 싶지 않습니다. 불필요한 계산없이 다른 방법이 있습니까?
이것은 두 값 과 사이의 부분으로 제한된 정수 구성 을 생성하는 것으로 효과적으로 귀결됩니다 . 이러한 구성을 재귀 적으로 생성하는 것은 간단한 문제입니다.M
N
또한 예에서 "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] 삭제
몇 마디 만하겠습니다