优化了Nodejs代码以在数组中查找字符串的变位符号.解决方案不应该使用所有子集来查找字符串的变位符



我想在数组中存储一对变位符。

输入将是数组。

示例:

let inputArray = ["abcd", "dbac", "adfs", "adsf", "bDca"];

它应该忽略字母的大小写。这里";abcd和bCa";是变位词。

输出应该是一个包含一对变位符的数组。

Example: [
'abcd is anagram of dbac',
'adfs is anagram of adsf',
'abcd is anagram of bDca'
]

正如您所提到的,查找所有子集然后查找变位符并不是优化的解决方案。我们可以在node.js中使用hashmap和一些内置方法。对数组中的每个字符串进行排序,以便比较变位符号。将排序后的字符串存储到哈希映射。若存在一个具有相同字符串的键,那个就是变位符。以下是Node.js 中的完整解决方案

let inputArray = ["abcd", "dbac", "adfs", "adsf", "bDca"];
let map = {};
let outputArray = [];
inputArray.forEach((anaString, index) => {
let sortedString = anaString.toLowerCase().split("").sort().join("");
if (map[sortedString] != null) {
outputArray.push(sortedString + " is anagram of " + anaString);
}
else {
map[sortedString] = index;
}
});
console.log(outputArray);

我最近解决了一个类似于java8中的问题,我可以很容易地将其转换为javascript。

要做到这一点,最简单的方法是循环遍历每一种可能性,然后循环遍历数组,看看是否有匹配项。然而,这将是极其缓慢的。为了克服这一点,我们可以创建一个";图案";并在我们沿着阵列移动时将其与其他阵列进行匹配。

以下代码应该可以解决您的问题

function pattern(str){
let map = new Map()
let curcount = 0
let pattern = ""
for(var i = 0; i < str.length; i++){
if(!map.get(str.charAt(i)+'')){
pattern+=String.fromCharCode(curcount);
map.put(str.charAt(i)+"",String.fromCharCode(curcount));
curcount++;
}
else{
pattern+=map.get(str.charAt(i)+"");
}
}
}

剩下的很容易做到,制作另一个映射(键是模式,值是字符串数组(并记录模式的每个实例,如果存在,则将单词弹出到数组中。您将被设置为:(

最新更新