scramble

JavaScript performance comparison

Revision 2 of this test case created

Preparation code

 
<script>
Benchmark.prototype.setup = function() {
    var arr = [
      ['lehlowww', 'hello'],
      ['dlrwxd', 'world'],
      ['rldoxwsd', 'world'],
      ['rkqodlw', 'world'],
      ['olaelh', 'hello'],
      ['helio', 'hell'],
      ['abcewnorde', 'wonder']
    ];
};
</script>

Test runner

Warning! For accurate results, please disable Firebug before running the tests. (Why?)

Java applet disabled.

Testing in unknown unknown
Test Ops/sec
max h
for (var i = 0; i < arr.length; i++) {
  StringScramble(arr[i][0], arr[i][1]);
}

function StringScramble(str1, str2) {
  var arr = new Array(26);
  var index;
  var arr_length = arr.length;
  var str1_length = str1.length;
  var str2_length = str2.length;
  // Initialize the array to 0
  for (var i = 0; i < arr_length; i++) {
    arr[i] = 0;
  }

  str2 = str2.toLowerCase();
  // Put char counts into arr for str2
  for (var j = 0; j < str2_length; j++) {
    index = str2[j].charCodeAt(0) - 97;
    arr[index] = arr[index] + 1;
  }

  // Compare str1 to str2
  for (var k = 0; k < str1_length; k++) {
    index = str1[k].charCodeAt(0) - 97;
    if (arr[index] > 0) arr[index] = arr[index] - 1;
  }

  // If any of the elements in the arry is non 0,
  // there's a mismatch and str1 cannot be a permutation of str2
  for (var n = 0; n < arr_length; n++) {
    if (arr[n] != 0) return false;
  }
  return true;
}
pending…
jenni
for (var i = 0; i < arr.length; i++) {
  StringScramble(arr[i][0], arr[i][1]);
}

function StringScramble(str1, str2) {
  var s1 = str1.split(""),
      s2 = str2.split(""),
      l1 = s1.length,
      l2 = s2.length,
      a1 = []; // duplicate array accounts for double letters
  for (var j = 0; j < l1; j++) {
    if (a1[s1[j]]) {
      a1[s1[j]]++;
    } else {
      a1[s1[j]] = 1;
    }
  }

  for (var i = 0; i < l2; i++) {
    if (a1[s2[i]] > 0) {
      a1[s2[i]]--;
    } else {
      return false;
    }
  }
  return true;
}
pending…
frank
for (var i = 0; i < arr.length; i++) {
  StringScramble(arr[i][0], arr[i][1]);
}

function StringScramble(str1, str2) {

  // Easy fail, if str1 isn't long enough
  if (str1.length < str2.length) {
    return false;
  }

  // Basic approach:
  // Sort the letters, then compare them
  // one by one, and bail out as soon as
  // we see a letter in s2 that s1 can't supply
  list1 = str1.split('').sort();
  list2 = str2.split('').sort();

  var c1 = list1.pop();
  var c2 = list2.pop();
  while (c1 && c2) {
    if (c1 == c2) {
      c1 = list1.pop();
      c2 = list2.pop();
    } else if (c1 < c2) {
      // str2 just asked for a char str1 can't provide
      return false;
    } else {
      // burn off excess str1 chars
      c1 = list1.pop();
    }
  }

  // a value leftover in c2 means that str1 dried up
  // before matching all of str2's needs.  Fail!
  return (!c2);
}
pending…
Kyle
for (var i = 0; i < arr.length; i++) {
  StringScramble(arr[i][0], arr[i][1]);
}

function StringScramble(str1, str2) {

  var count = 0;

  var lowerstr1 = str1.toLowerCase();
  var lowerstr2 = str2.toLowerCase();
  var splitarr1 = lowerstr1.split("");
  var splitarr2 = lowerstr2.split("");

  for (var i = 0; i < splitarr1.length; i++) {
    for (var j = 0; j < splitarr2.length; j++) {
      if (splitarr2[j] === splitarr1[i]) {
        splitarr1[i] = "*";
        count++;
      }

      if (count == splitarr2.length) {
        return "true";
      }
    }
  }
  return "false"

}
pending…
Sam P
for (var i = 0; i < arr.length; i++) {
  StringScramble(arr[i][0], arr[i][1]);
}

function StringScramble(str1, str2) {
   if (str2.length > str1.length) return false;

  var arr1 = [];
  for (var i = 0, length = str1.length; i < length; i++) {
    arr1.push(str1.charCodeAt(i));
  }

  var arr2 = [];
  for (i = 0, length = str2.length; i < length; i++) {
    arr2.push(str2.charCodeAt(i));
  }

  for (i = 0; i < arr2.length; i++) {
    if ((x = arr1.indexOf(arr2[i])) > -1) arr1.splice(x, 1);
    else return false;
  }

  return true;
}
pending…

Compare results of other browsers

Revisions

You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:

0 comments

Add a comment