JavaScript字符串中的公共字符计数
问题是: 给定两个字符串,查找它们之间的公共字符数 对于s1=aabcc和s2=adcaa,输出应为3 我编写了以下代码: 函数commonCharacterCounts1、s2{ var计数=0; var-str=; 对于变量i=0;iJavaScript字符串中的公共字符计数,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不会改变调用的字符串,但会返回一个新字符串,
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如果你对否决你的意见感到满意,就接受这个答案,但这与问题无关。对您来说,将两个字符串合并可能是一个步骤,但它根本无法回答问题。你能提供一个完整的例子来说明你的建议吗?很抱歉投你的反对票,但这与问题无关。对您来说,将两个字符串合并可能是一个步骤,但它根本无法回答问题。你能提供一个完整的例子来说明你的建议吗?