在二进制字符串中查找模式

boo*_*nka 6 javascript algorithm pattern-matching

我试图在一串二进制数字中找到重复模式.

例如.0010010010或1110111011 = ok

不.0100101101 =糟糕

字符串长度为10位(如上所述)&我猜测"模式"的2次迭代是最小的.

我开始手动设置程序可以匹配的"银行"模式但是必须有更好的方法使用算法?

搜索让我无处可去 - 我认为我使用的语言和术语不正确..

Jan*_*roň 2

这是一个很大的挑战。这个功能怎么样?

function findPattern(n) {
    var maxlen = parseInt(n.length/2);
    NEXT:
    for(var i=1; i<=maxlen; ++i) {
        var len=0, k=0, prev="", sub;
        do {
            sub = n.substring(k,k+i);
            k+= i;
            len = sub.length;
            if(len!=i) break;
            if(prev.length && sub.length==i && prev!=sub) continue NEXT;
            if(!prev.length) prev = sub;
        } while(sub.length);
        var trail = n.substr(n.length-len);
        if(!len || len && trail==n.substr(0,len)) return n.substr(0,i);
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

它甚至适用于具有任何内容的任何长度的字符串。看小提琴

受 Jack 和 Zim-Zam 答案的启发,以下是暴力算法列表:

var oksubs =
["001","010","011","100","101","110",
"0001","0010","0011","0100","0101","0110","0111",
"1000","1001","1010","1011","1100","1101","1110",
"00000","00001","00011","00101","00110","00111","01000",
"01001","01010","01011","01100","01101","01110","01111",
"10000","10001","10011","10101","10110","10111","11000","11001",
"11010","11011","11100","11101","11110","11111"];
Run Code Online (Sandbox Code Playgroud)

感谢 Jack 的评论,这里是简短而有效的代码:

function findPattern(n) {
    var oksubs = [n.substr(0,5),n.substr(0,4),n.substr(0,3)];
    for(var i=0; i<oksubs.length; ++i) {
        var sub = oksubs[i];
        if((sub+sub+sub+sub).substr(0,10)==n) return sub;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)