JavaScript字符串中的公共字符计数

JavaScript字符串中的公共字符计数,javascript,indexof,Javascript,Indexof,问题是: 给定两个字符串,查找它们之间的公共字符数 对于s1=aabcc和s2=adcaa,输出应为3 我编写了以下代码: 函数commonCharacterCounts1、s2{ var计数=0; var-str=; 对于变量i=0;i-1&&str.indexOfs1[i]=-1{ 计数++; str.concats1[i] } } 返回计数; } console.logcommonCharacterCountaabcc、adcaa concat不会改变调用的字符串,但会返回一个新字符串,

问题是:

给定两个字符串,查找它们之间的公共字符数

对于s1=aabcc和s2=adcaa,输出应为3

我编写了以下代码:

函数commonCharacterCounts1、s2{ var计数=0; var-str=; 对于变量i=0;i-1&&str.indexOfs1[i]=-1{ 计数++; str.concats1[i] } } 返回计数; } console.logcommonCharacterCountaabcc、adcaa concat不会改变调用的字符串,但会返回一个新字符串,do:

str = str.concat(s1[i]);
或者只是

str += s1[i];
concat不会改变调用的字符串,但会返回一个新字符串,do:

str = str.concat(s1[i]);
或者只是

str += s1[i];

您可以通过以下步骤执行此操作:

创建一个返回对象的函数。将键作为字母,将计数作为值 在main函数中获取两个字符串的count对象 在中使用for..遍历任何对象 检查其他对象是否具有第一个对象的密钥。 如果已经添加了至少一个,则使用 设s1=aabcc 设s2=adcaa 函数计数字符{ 设obj={}; arr.forEachi=>obj[i]?obj[i]+:obj[i]=1; 返回obj; } 函数公共[…s1],…s2]{ s1=计数字符1; s2=计数字符2; 让计数=0; s1中的forlet键{ ifs2[key]count+=Math.mins1[key],s2[key]; } 返回计数 }
console.logcommons1,s2您可以通过以下步骤完成此操作:

创建一个返回对象的函数。将键作为字母,将计数作为值 在main函数中获取两个字符串的count对象 在中使用for..遍历任何对象 检查其他对象是否具有第一个对象的密钥。 如果已经添加了至少一个,则使用 设s1=aabcc 设s2=adcaa 函数计数字符{ 设obj={}; arr.forEachi=>obj[i]?obj[i]+:obj[i]=1; 返回obj; } 函数公共[…s1],…s2]{ s1=计数字符1; s2=计数字符2; 让计数=0; s1中的forlet键{ ifs2[key]count+=Math.mins1[key],s2[key]; } 返回计数 }
还有其他更有效的答案,但是这个答案更容易理解。这将遍历第一个字符串,并检查第二个字符串是否包含该值。如果是,则计数将增加,并从s2中删除该元素以防止重复

函数commonCharacterCounts1、s2{ var计数=0; s1=s1.5; s2=s2.0; s1.forEache=>{ 如果s2.E包括在内{ 计数++; s2.s2.indexOfe,1; } }; 返回计数; }
console.logcommonCharacterCountaabcc、adcaa 还有其他更有效的答案,但这个答案更容易理解。这将遍历第一个字符串,并检查第二个字符串是否包含该值。如果是,则计数将增加,并从s2中删除该元素以防止重复

函数commonCharacterCounts1、s2{ var计数=0; s1=s1.5; s2=s2.0; s1.forEache=>{ 如果s2.E包括在内{ 计数++; s2.s2.indexOfe,1; } }; 返回计数; }
console.logcommonCharacterCountaabcc、adcaa 您可以存储每个字符的频率,然后浏览此映射char->frequency并找到常见的字符

function common(a, b) {
    const m1 = {};
    const m2 = {};
    let count = 0;
    for (const c of a) m1[c] = m1[c] ? m1[c]+1 : 1;
    for (const c of b) m2[c] = m2[c] ? m2[c]+1 : 1;
    for (const c of Object.keys(m1)) if (m2[c]) count += Math.min(m1[c], m2[c]);
    return count;
}

您可以存储每个字符的频率,然后浏览此映射char->frequency并找到常见的字符

function common(a, b) {
    const m1 = {};
    const m2 = {};
    let count = 0;
    for (const c of a) m1[c] = m1[c] ? m1[c]+1 : 1;
    for (const c of b) m2[c] = m2[c] ? m2[c]+1 : 1;
    for (const c of Object.keys(m1)) if (m2[c]) count += Math.min(m1[c], m2[c]);
    return count;
}

发布问题后,我发现我没有很好地看待这个例子。我认为它需要独特的共同特征。。 我改变了它,现在它是正确的

函数commonCharacterCounts1、s2{ var计数=0; var-str=; forvar i=0;i-1{ 计数++; s2=s2。替换1[i],; } } 返回计数;
} 发布问题后,我发现我没有很好地看待这个例子。我认为它需要独特的共同特征。。 我改变了它,现在它是正确的

函数commonCharacterCounts1、s2{ var计数=0; var-str=; forvar i=0;i-1{ 计数++; s2=s2。替换1[i],; } } 返回计数; } 创建2个对象,其中包含字符串s1的字符及其计数 和s2

对2个对象中的公用键进行计数,并返回Count-将公用键与两个字符串中的最小计数相加

在时间和空间上的复杂性

创建2个对象,其中包含字符串s1的字符及其计数 和s2

对2个对象中的公用键进行计数,并返回Count-将公用键与两个字符串中的最小计数相加

在时间和空间上的复杂性


我认为这是一种更容易理解的方式

function commonCharacterCount(s1: string, s2: string): number {
    
    let vs1 = [];
    let vs2 = [];
    let counter = 0;
    
    vs1 = Array.from(s1);
    vs2 = Array.from(s2);
    
    vs1.sort();
    vs2.sort();
    
    let match_char = [];
    
    for(let i = 0; i < vs1.length; i++){
        
        for(let j = 0; j < vs2.length; j++){
            
            if(vs1[i] == vs2[j]){
                match_char.push(vs1[i]);
                vs2.splice(j, 1);
                break;
            }
        }
    }    
    
    return match_char.length;
}

我认为这是一种更容易理解的方式

function commonCharacterCount(s1: string, s2: string): number {
    
    let vs1 = [];
    let vs2 = [];
    let counter = 0;
    
    vs1 = Array.from(s1);
    vs2 = Array.from(s2);
    
    vs1.sort();
    vs2.sort();
    
    let match_char = [];
    
    for(let i = 0; i < vs1.length; i++){
        
        for(let j = 0; j < vs2.length; j++){
            
            if(vs1[i] == vs2[j]){
                match_char.push(vs1[i]);
                vs2.splice(j, 1);
                break;
            }
        }
    }    
    
    return match_char.length;
}

JavaScript ES6清洁解决方案。使用循环和方法

变量commonCharacterCount=s1,s2=>{ 常量结果=[]; 常量引用=[…s1]; 设str=s2; const推荐信 { 如果str.includeLetter{ 结果:一封信; str=str.replaceletter; } } //['a','a','c']; 返回result.length; }; //测试: console.logcommonCharacterCount'aabcc','adcaa'; console.logcommonCharacterCount'abcd','aad';
控制台.logcommonCharacterCount'Geeksforgeks','Platformforgeks' JavaScript ES6清洁解决方案。使用循环和方法

变量commonCharacterCount=s1,s2=>{ 常量结果=[]; 常量引用=[…s1]; 设str=s2; const推荐信{ 如果str.includeLetter{ 结果:一封信; str=str.replaceletter; } } //['a','a','c']; 返回result.length; }; //测试: console.logcommonCharacterCount'aabcc','adcaa'; console.logcommonCharacterCount'abcd','aad';
控制台.logcommonCharacterCount'Geeksforgeks','Platformforgeks';您是想在字符串中找到常用字符还是不同字符?这不是同一个问题,但答案可能会帮助您简化方法,并解决您遇到的一个问题,即您仅使用indexOf在字符串中查找字符的第一个实例:您是否试图在字符串中查找常见或不同的字符?这不是同一个问题,但是这些答案可能会帮助您简化方法,并解决您遇到的一个问题,那就是您只在带有indexOf的字符串中找到字符的第一个实例:@eng这不是最有效、最快的答案,但在我看来,这是最容易理解的。你能分享一下你的更快更有效的答案吗?@eng其他大多数答案都更有效更有效faster@eng这不是最有效、最快的答案,但在我看来,这是最容易理解的。你能分享一下你的更快更有效的答案吗?@eng其他大多数答案都更有效更有效faster@eng如果你对这个问题感到满意,就接受这个答案it@eng如果你对否决你的意见感到满意,就接受这个答案,但这与问题无关。对您来说,将两个字符串合并可能是一个步骤,但它根本无法回答问题。你能提供一个完整的例子来说明你的建议吗?很抱歉投你的反对票,但这与问题无关。对您来说,将两个字符串合并可能是一个步骤,但它根本无法回答问题。你能提供一个完整的例子来说明你的建议吗?