字符串中的常见字符数 JavaScript
Common Character Count in Strings JavaScript
这是问题所在:
给定两个字符串,找出它们之间的共同字符数。
对于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;
}
console.log(commonCharacterCount("aabcc", "adcaa"));
它没有给出正确答案,我想知道我错在哪里?
因为 .concat
不会改变调用的字符串,但它 returns 是一个新字符串,请执行:
str = str.concat(s1[i]);
或者只是
str += s1[i];
您可以按照以下步骤进行操作:
- 创建一个
function
即return一个对象。 键作为字母并且计数为值
- 在主
function
中获取两个字符串的计数对象
- 使用
for..in
遍历任何对象
- 检查其他对象是否具有第一个对象的
key
。
- 如果使用
Math.min()
将最少的一个添加到 count
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))
还有其他更高效的答案,但这个答案更容易理解。这遍历第一个字符串,并检查第二个字符串是否包含该值。如果是这样,则计数增加,并删除 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"));
您可以存储每个字符的频率并查看此映射 (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;
}
为字符串 s1 创建 2 个包含字符及其计数的对象
和 s2
计算 2 个对象中的公共键和 return 计数 - 将两个字符串中具有最小计数的公共键相加
O(n) - 时间和 O(n) - space 复杂度
function commonCharacterCount(s1, s2) {
let obj1 = {}
let obj2 = {}
for(let char of s1){
if(!obj1[char]) {
obj1[char] = 1
} else
obj1[char]++
}
for(let char of s2){
if(!obj2[char]) {
obj2[char] = 1
} else
obj2[char]++
}
console.log(obj1,obj2)
let count = 0
for(let key in obj1 ){
if(obj2[key])
count += Math.min(obj1[key],obj2[key])
}
return 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;
}
JavaScript ES6 干净的解决方案。使用for...of
loop and includes
方法。
var commonCharacterCount = (s1, s2) => {
const result = [];
const reference = [...s1];
let str = s2;
for (const letter of reference) {
if (str.includes(letter)) {
result.push(letter);
str = str.replace(letter, '');
}
}
// ['a', 'a', 'c'];
return result.length;
};
// Test:
console.log(commonCharacterCount('aabcc', 'adcaa'));
console.log(commonCharacterCount('abcd', 'aad'));
console.log(commonCharacterCount('geeksforgeeks', 'platformforgeeks'));
这是问题所在:
给定两个字符串,找出它们之间的共同字符数。
对于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;
}
console.log(commonCharacterCount("aabcc", "adcaa"));
它没有给出正确答案,我想知道我错在哪里?
因为 .concat
不会改变调用的字符串,但它 returns 是一个新字符串,请执行:
str = str.concat(s1[i]);
或者只是
str += s1[i];
您可以按照以下步骤进行操作:
- 创建一个
function
即return一个对象。 键作为字母并且计数为值 - 在主
function
中获取两个字符串的计数对象
- 使用
for..in
遍历任何对象
- 检查其他对象是否具有第一个对象的
key
。 - 如果使用
Math.min()
将最少的一个添加到
count
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))
还有其他更高效的答案,但这个答案更容易理解。这遍历第一个字符串,并检查第二个字符串是否包含该值。如果是这样,则计数增加,并删除 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"));
您可以存储每个字符的频率并查看此映射 (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;
}
为字符串 s1 创建 2 个包含字符及其计数的对象 和 s2
计算 2 个对象中的公共键和 return 计数 - 将两个字符串中具有最小计数的公共键相加
O(n) - 时间和 O(n) - space 复杂度
function commonCharacterCount(s1, s2) {
let obj1 = {}
let obj2 = {}
for(let char of s1){
if(!obj1[char]) {
obj1[char] = 1
} else
obj1[char]++
}
for(let char of s2){
if(!obj2[char]) {
obj2[char] = 1
} else
obj2[char]++
}
console.log(obj1,obj2)
let count = 0
for(let key in obj1 ){
if(obj2[key])
count += Math.min(obj1[key],obj2[key])
}
return 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;
}
JavaScript ES6 干净的解决方案。使用for...of
loop and includes
方法。
var commonCharacterCount = (s1, s2) => {
const result = [];
const reference = [...s1];
let str = s2;
for (const letter of reference) {
if (str.includes(letter)) {
result.push(letter);
str = str.replace(letter, '');
}
}
// ['a', 'a', 'c'];
return result.length;
};
// Test:
console.log(commonCharacterCount('aabcc', 'adcaa'));
console.log(commonCharacterCount('abcd', 'aad'));
console.log(commonCharacterCount('geeksforgeeks', 'platformforgeeks'));