如果数组的第一个元素中的字符串包含数组第二个元素中字符串的所有字母,则返回true

时间:2018-05-19 11:45:50

标签: javascript arrays mutation

我的代码正在运行,除了变异([“Mary”,“Army”])应该返回true,但它返回false并且 mut([“Mary”,“Aarmy”])应该返回true,但它返回false。

有人可以解释为什么会这样吗?

到目前为止我的代码

function mutation(arr) {
    a=arr.slice(0,1); var a_str  = a.toString();  a_arr  =  Array.from(a_str);  
    b=arr.slice(1,2); var b_str  = b.toString();  b_arr  =  Array.from(b_str);
    var  flag=0; 

    for(var  i=0;i<b_arr.length;i++){  
        for(var  j=0;j<a_arr.length;j++){
            if(b_arr[i]==a_arr[j]){
                flag+=1;
            }
        }
    }

    if(flag>=b_arr.length){
        return  true;
    } else  return  false;
}

console.log(mutation(["Mary", "Aarmy"]));

4 个答案:

答案 0 :(得分:1)

问题:

您的代码存在的问题是JavaScript是case-sensitive,而您的代码并不期望这样,您可以执行以下操作:

解决方案:

如果两者在这种情况下相同:

然后你基本上可以进行anagram检查:

&#13;
&#13;
anagram = _ => _.toLowerCase().split('').sort().join('').trim();

const isAnagram = _ => anagram(_[0]) === anagram(_[1])
&#13;
&#13;
&#13;

另外,你可以沿着这些方向做点什么:

&#13;
&#13;
check = a => !a[0].split ``.map(_ => _[X = `toLowerCase`]()).filter(_ => !a[1].includes(_[X]())).length

console.log(check(['Mary','Aarmy']))
&#13;
&#13;
&#13;

答案 1 :(得分:1)

如果使用Set,您可以非常简单地执行此操作。例如:

&#13;
&#13;
const mutation = arr => {
  var a = new Set(arr[0].toLowerCase())
  var b = new Set(arr[1].toLowerCase())
  return [...a].every(ch => b.has(ch))  
}

console.log(mutation(["Mary", "Army"]))
console.log(mutation(["Mary", "Aarmy"]))
console.log(mutation(["Mary", "Aary"]))
console.log(mutation(["ab", "abba"]))
console.log(mutation(["voodoo", "no"]))
&#13;
&#13;
&#13;

我仍然觉得这个问题存在一些含糊之处,但如果需要准确性,你也可以检查设定的尺寸是否相等(因为它们包含所有独特的字母)

答案 2 :(得分:0)

您可以使用mapfiltertoLowerCase功能来实现这一目标。

示例:

function mutation(arr){ 
    return !arr[0].split("")
    .map(x => x.toLowerCase())
    .filter(l => !arr[1].includes(l.toLowerCase())).length
}

var res = mutation(["Mary", "Aarmy"]);

console.log(res); //true

答案 3 :(得分:0)

您需要使用toLowerCase()来比较每个字符与不区分大小写。你可以进一步删除额外的内循环,并做这样的事情:

function mutation(checkArray){
  var firstElement = checkArray[0];
  var secondElement = checkArray[1];
  var splitSecondElement = secondElement.split('');
  var matched = true;
  for(var i=0; i<splitSecondElement.length; i++){
    var firstElementLower = firstElement.toLowerCase();
    var characterLower = splitSecondElement[i].toLowerCase();
    if(firstElementLower.indexOf(characterLower) === -1){
      matched = false;
      break;
    }
  }
  return matched;
}

console.log(mutation(["Mary", "Army"]));
console.log(mutation(["Mary", "Aarmy"]));
console.log(mutation(["Mary", "Aarmyxyz"]));