使用json.stringify的Anagram解决方案是解决此问题的正确方法

时间:2019-09-27 00:42:42

标签: javascript

我已经整理出两个字符串,然后使用json.stringify比较它以获得Anagram。请参考下面的代码,这是正确的编码方法。

function same(ar, ar1) {
  //sorting the string
  var o = ar.split("").sort();
  var o1 = ar1.split("").sort();
  //comparing two string
  if (JSON.stringify(o) == JSON.stringify(o1)) {
    return true;
  } else {
    return false;
  }
}
same("ria", "air"); //true
same("", ""); //true
same("aaz", zza); //false

1 个答案:

答案 0 :(得分:1)

在大多数情况下都可以使用,但是不必要地在计算上昂贵。

使用某些非ASCII字符时,可能不起作用,因为.split('')将导致字符代码点分离,例如:

console.log('?'.split(''));

这不是每个字符作为数组元素的准确表示。 Use Array.from instead

console.log(Array.from('?'));

此后,您还可以通过计算每个字符的出现次数(O(n))而不是排序(O(n log n))来降低算法的开销。例如:

const getCount = str => Array.from(str).reduce((counts, char) => {
  counts[char] = (counts[char] || 0) + 1;
  return counts;
}, {});

function same(ar,ar1){
  const counts1 = getCount(ar);
  const counts2 = getCount(ar1);
  const keys1 = Object.keys(counts1);
  const keys2 = Object.keys(counts2);
  if (keys1.length !== keys2.length) {
    return false;
  }
  return keys1.every(char => counts1[char] === counts2[char]);
}
console.log(same('abc', 'cba'));
console.log(same('abc', 'aba'));