首页 > 解决方案 > 如何检查string1数字是否可以重新排列成string2?

问题描述

我想编写一个接受 str1 和 str2 的函数,并检查 str1 数字是否可以重新排列到 str2 中。

目前停留在这个:

我的代码工作正常,直到 str2 没有任何两位数。我怎样才能解决这个问题?

function scramble(str1, str2) {
    str1 = str1.split('');
    str2 = str2.split('');

    let result = [];

    for (let i = 0; i < str2.length; i++) {
        for (let j = 0; j < str1.length; j++) {
            if (str2[i] === str1[j]) {
                result.push(str1[j]);
            }
        }
    }


    for (let i = 0; i < result.length; i++) {
        if (result[i] === result[i + 1]) {
            result.splice(i, 1);
            --i;
        }
    }
    return result.join('') === str2.join('')
}
console.log(scramble('rkqodlw','world'));
console.log(scramble('aabbcamaomsccdd','commas')); //heres the problem

标签: javascriptarrayssorting

解决方案


您想要计算每个字符中的各种字符并将其用作比较。

以下使用Map对象然后迭代 str2 计数以确保测试字符串 (str1) 包含等于或大于 str2 中每个字符的计数

// helper function to map character counts
const charCount = (str) =>{
    return [...str].reduce((a,c)=> a.set(c, (a.get(c)||0)+1), new Map)
}

function scramble(str1, str2) {
   const s2Counts = charCount(str2),
         s1Counts = charCount(str1);
        
   return [...s2Counts.entries()].every(([char,count]) => s1Counts.get(char) >= count)
}
console.log(scramble('rkqodlw','world')); // expect true
console.log(scramble('aabbcamaomsccdd','commas')); // expect true

console.log(scramble('fobar','foobar')); // expect false


推荐阅读