在字符串b中查找较小字符串s的所有排列(JavaScript)
我一直在试图找到以下问题的O(n)解决方案:在字符串b中找到字符串s的字谜(排列)数量,其中s.length总是小于b.length 我了解到最佳解决方案包括跟踪较小字符串中字符的频率,并在滑动窗口在较大字符串中移动时对其执行相同的操作,但我不确定该实现实际上是如何工作的。现在我的解决方案不起作用(见注释),但即使它起作用,也需要O(s+sn)时间 编辑:示例输入:在字符串b中查找较小字符串s的所有排列(JavaScript),javascript,string,algorithm,Javascript,String,Algorithm,我一直在试图找到以下问题的O(n)解决方案:在字符串b中找到字符串s的字谜(排列)数量,其中s.length总是小于b.length 我了解到最佳解决方案包括跟踪较小字符串中字符的频率,并在滑动窗口在较大字符串中移动时对其执行相同的操作,但我不确定该实现实际上是如何工作的。现在我的解决方案不起作用(见注释),但即使它起作用,也需要O(s+sn)时间 编辑:示例输入:('aba','abaab')。输出:3,因为'aba'存在于从索引0开始的b中,而'baa'存在于1处,而'aab'存在于2处 f
('aba','abaab')
。输出:3,因为'aba'
存在于从索引0开始的b中,而'baa'
存在于1处,而'aab'
存在于2处
function anagramsInStr(s,b) {
//O(s)
let freq = s.split("").reduce((map, el) => {
map[el] = (map[el] + 1) || 1;
return map;
}, {});
let i = 0, j = s.length;
// O(n)
for (let char in b.split("")) {
// O(s)
if (b.length - char + 1 > s.length) {
let window = b.slice(i,j);
let windowFreq = window.split("").reduce((map, el) => {
map[el] = (map[el] + 1) || 1;
return map;
}, {});
// Somewhere about here compare the frequencies of chars found in the window to the frequencies hash defined in the outer scope.
i++;
j++;
}
}
}
请通读评论,如果您有任何问题,请告诉我:
函数计数一个全局事件(s,b){
var-matchCount=0;
var sconts={};//统计s中的字母
var bCounts={};//b中字母的计数
//建造童子军
对于(变量i=0;i=s.length){
b计数[b[i-s.长度]]-=1;
}
//增加我们当前正在查看的信件的计数
b计数[b[i]=(b计数[b[i]| | 0)+1;
//测试是否匹配(b计数==s计数)
var匹配=真;
对于(var j=0;j console.log(countAnagramOccurrences('aba','abaab'));//3
您能举一个输入和预期输出的例子吗?我很难理解目标。(这仅仅是为了检查s
是否可以从b
生成?还是为了计算方法的数量?还是其他?@smarx是的!在问题中添加了示例输入和输出。