这是问题:给定两个字符串,找到它们之间的公共字符数。以及它的一个例子:
对于s1 =“aabcc”和s2 =“adcaa”,输出应为3。
我写了这段代码:
function commonCharacterCount(s1, s2) {
var count = 0;
var str="";
for(var i=0; i<s1.length ; i++){
if(s2.indexOf(s1[i])>-1 && str.indexOf(s1[i])==-1){
count++;
str.concat(s1[i])
}
}
return count;
}
它没有给出正确答案,我想知道我哪里错了?非常感谢任何帮助
还有其他更有效的答案,但这个答案更容易理解。这循环遍历第一个字符串,并检查第二个字符串是否包含该值。如果是,则计数增加,并且删除s2
中的元素以防止重复。
function commonCharacterCount(s1, s2) {
var count = 0;
s1 = s1.split('');
s2 = s2.split('');
s1.forEach(e => {
if (s2.includes(e)) {
count++;
s2.splice(s2.indexOf(e), 1);
}
});
return count;
}
console.log(commonCharacterCount("aabcc", "adcaa"));
您可以通过以下步骤执行此操作:
function
。键为字母,计为值function
中获取两个字符串的计数对象for..in
迭代任何对象key
。count
将至少一个添加到Math.min()
let s1 = "aabcc"
let s2 = "adcaa"
function countChars(arr){
let obj = {};
arr.forEach(i => obj[i] ? obj[i]++ : obj[i] = 1);
return obj;
}
function common([...s1],[...s2]){
s1 = countChars(s1);
s2 = countChars(s2);
let count = 0;
for(let key in s1){
if(s2[key]) count += Math.min(s1[key],s2[key]);
}
return count
}
console.log(common(s1,s2))
原因.concat
不会改变调用的字符串,但它会返回一个新字符串,执行:
str = str.concat(s1[i]);
要不就
str += s1[i];
您可以存储每个字符的频率并查看此映射(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;
}
在发布问题后,我发现我没有好好看看这个例子。我认为它需要独特的共同角色..而且我改变它,现在它是正确的
function commonCharacterCount(s1, s2) {
var count = 0;
var str="";
for(var i=0; i<s1.length ; i++){
if(s2.indexOf(s1[i])>-1){
count++;
s2=s2.replace(s1[i],'');
}
}
return count;
}