暴力解决:
对主串的每一个字符作为子串开头,与要匹配的字符串进行匹配。对主串作大循环,每个字符开头做T的长度的小循环,直到匹配成功或全部遍历完为止。
function Index(S,T) {
var i=0;
var j=0;
while (i<S.length && j<T.length){
if(S[i]==T[j]){
++i;
++j;
} else {
i=i-j+1;//i退回到上次匹配首位的下一位
j=0;//j退回到子串T的首位
}
}
if(j>=T.length){
return i-T.length;
} else {
return -1;
}
}
KMP模式匹配算法
function getNext(T) {
var next=new Array(T.length);
var i=0;
var j=-1;
next[i]=j;
while (i<T.length-1){
if(j==-1 || T[i]==T[j]){
i++;
j++;
next[i]=j;
} else {
j=next[j];
}
}
return next;
}
function indexOf(S,T) {
var i=0,j=0;
var sLen=S.length;
var tLen=T.length;
var next=getNext(T);
while (i<sLen && j<tLen){
if(j==-1 || S[i]==T[i]){
i++;
j++;
} else {
j=next[j];
}
}
if(j==tLen)
return i-j;
return -1;
}
优化的KMP模式匹配算法
function getNext(T) {
var tLen=T.length;
var next=new Array(tLen);
var k=-1;
var j=0;
next[0]=-1;
while (j<tLen-1){
if(k==-1 || t[j]==t[k]){
k++;
j++;
if(t[j]!=t[k]){
next[j]=k;
} else {
next[j]=next[k];
}
} else {
k=next[k];
}
}
return next;
}