JSFiddle - React, Tailwind, and code Playground
JavaScript
var string = "TGATGCCGTCCCCTCAACTTGAGTGCTCCTAATGCGTTGC",
iterations = 100000;
var regex = new RegExp(/C(?:C(?:T(?:CT|TC)|CTT)|T(?:C(?:CT|TC)|TCC))|T(?:C(?:C(?:CT|TC)|TCC)|TCCC)/);
function c3t2(str) {
for (index = 0; index + 5 < str.length; index++) {
var substring = str.substring(index, index+5);
var chars = substring.split("");
if (chars.sort().join("") === "CCCTT") {
return index;
}
}
return false;
}
function c3t2_optimized(str) {
var c = 0, t = 0;
for (var i = 0; i < str.length; ++i) {
var last = str.charAt(i);
if (last == 'C') ++c;
else if (last == 'T') ++t;
if (i > 4) {
var first = str.charAt(i - 5);
if (first == 'C') --c;
else if (first == 'T') --t;
}
if (c == 3 && t == 2) return i - 4;
}
return -1;
}
console.time('regex');
for (var i = 0; i < iterations; ++i) {
var result = regex.exec(string);
}
console.timeEnd('regex');
console.time('c3t2');
for (var i = 0; i < iterations; ++i) {
var result = c3t2(string);
}
console.timeEnd('c3t2');
console.time('c3t2_optimized');
for (var i = 0; i < iterations; ++i) {
var result = c3t2_optimized(string);
}
console.timeEnd('c3t2_optimized');