Найти число вхождений определенной строки в группе символов WITH A CATCH

Я пытаюсь выяснить, как вычислить количество вхождений определенной строки в группе символов. Уловка состоит в том, что буквы в строке не должны быть рядом друг с другом, но должны появляться в последовательном порядке.

Например, последовательность «aabcc» содержит четыре вхождения строки «abc»,

a a bc c

a a b c c

a abc c

a ab c c

Я думал об использовании регулярных выражений, но это соответствует только совпадению первого совпадения.

Caveat : это JavaScript (извините!). Это также, вероятно, намного сложнее, чем нужно, но мой ОКР не оставил бы его в покое.

function search(needle, haystack) { var needles = needle.split(''); var haystacks = haystack.split(''); var matches = []; var nI = 0; var hI = 0; for (hI = 0; hI < haystacks.length; hI++) { for (nI = 0; nI < needles.length; nI++) { if (haystacks[hI] === needles[nI]) { matches.push(nI); } else { continue; } } } matches = matches.reduce(function (acc, el, index) { var cur = acc.map[el]; if (!cur) { acc.map[el] = cur = []; acc.res.push(cur); } cur.push(index); return acc; }, { res: [], map: {} }).res; return matches; } function allPossibleCases(arr) { return combinations(arr).map(function (combination) { return combination.join(" "); }); } function combinations(array) { if (!array.length) { return []; } array = array.map(function (item) { return item instanceof Array ? item : [item]; }); function combine(list) { var prefixes, combinations; if (list.length === 1) { return list[0]; } prefixes = list[0]; combinations = combine(list.slice(1)); return prefixes.reduce(function (memo, prefix) { return memo.concat(combinations.map(function (combination) { return [prefix].concat(combination); })) }, []); } return combine(array); } var r = allPossibleCases(search("abc", "aabcc")); // r.length = 4, r = array of matches 

Вот скрипка, в которую можно играть.

Примечание: за счет использования какого-либо кода из этого ответа учитываются остальные объекты.