我试图弄清楚如何计算一组字符中特定字符串的出现次数。问题是字符串中的字母不需要彼此相邻,而必须按顺序出现。
例如,序列" aabcc"包含四个字符串" abc"
一个一个的 BC C
一个一个的 B'/强> C C
一个的 ABC C
一个的 AB C C
我考虑过使用正则表达式,但这只匹配匹配的第一次出现。
答案 0 :(得分:1)
警告:这是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
在这里玩fiddle。
注意:利用this answer中的一些代码来计算剩余的对象。