检查阵列A是否有阵列B排列

时间:2015-05-15 23:01:54

标签: javascript arrays recursion

目的

给定阵列A和阵列B,查看阵列B的值是否在阵列A中(忽略序列/顺序)。基本上,我们要检查一个数组中包含的所有字母是否以某种形式包含在另一个数组中。

示例#1

mutation(['hello', 'hey']);

输出#1

false //no 'y' in 'hello'

示例#2

mutation(['Alien', 'line']))

输出#2

true //'l','i','n','e' is present in 'Alien'

MY PSEUDO-CODE / ATTEMPT

function mutation(arr) {
  //split into two arrays with individual letters (for comparison purposes)
  var arr0 = arr[0].split('');
  var arr1 = arr[1].split('');

  //if the letters in arr[1] exceed arr[0], there is no match (no matter what) 
  if (arr1 > arr0) {
    return false;
  } 
  //if arr0 > arr1 check each letter or arr1[i] against arr0[j]. 
  else if (arr0 > arr1) { 
    for (i = 0; i < arr1.length; i++) {
      //compare arr1[i] to all arr0[j] values
      //if all of arr1 is present in arr0, return true
      return true;
    }

  } else {
    //If one of arr1's letters is not present in arr0, return false
    return false; 
  }
}

mutation(['hello', 'hey']);

问题

  1. 我知道这可以通过&#34;递归&#34;来解决,但我不确定如何正确执行它。我认为我走的是正确的道路,但任何指导都会受到赞赏。
  2. 如何使用FOR循环迭代两个不同的变量(例如arr0 [i]和arr1 [j])?

2 个答案:

答案 0 :(得分:3)

例如,在net use $ServerFullPath /user:$ServerCredentialUser $ServerCredentialPassword /y 中查找"aaa"时,您的伪代码会出现误报。当第一个字符串与第二个字符串中的字符匹配时,您需要从第一个字符串中删除字符,以便它们不会被重复用于第二个字符串中的重复字符。

遍历第二个字符串中的字符并在第一个字符串中查找它们。如果发现它从第一个字符串中删除,否则返回false。如果找到所有字符,则返回true:

"bad"

答案 1 :(得分:0)

蛮力&#39;解决这个问题的方法是使用2个嵌套for循环遍历数组。但是,这将导致O(n ^ 2)运行时复杂性。

要在O(n)运行时复杂度中解决此问题,请将所有数组A的值存储在哈希中,然后检查数组B的值是否在哈希值中。请注意,此解决方案仍然有2个for循环,不同之处在于它们不是嵌套的,这会导致O(n)运行时复杂性。

JSFiddle

var mutation = function(arr) {    
    var areBInA = true;

    // Convert from string to array
    var a = arr[0].split('');
    var b = arr[1].split('');
    console.log('a b %o %o', a, b);

    // Create hash for array A
    var aHash = {};
    for(var i = 0; i < a.length; ++i) {
        aHash[a[i]] = 1;
    }
    console.log('aHash %o', aHash);

    // Check if array B values are in hash A
    for(var i = 0; i < b.length; ++i) {
        if(aHash[b[i]] !== 1) {
            console.log('fail at %o', b[i]);
            areBInA = false;
            break;
        }
    }

    return areBInA;
};

console.log('hello hey %o', mutation(['hello', 'hey']));
console.log('Alien line %o', mutation(['Alien', 'line']));