Войти

Показать полную графическую версию : Автомат


anoxina
17-04-2016, 10:45
var t = r.ReadLine(); //Считывает первую строку
var st2 = r.ReadAll();//Считывает оставшийся текст

r.Close();

var now = new Date();
var m=t.length; //m длина первой строки
var alph=new Array();
//Определяем алфавит строки t

for(var i=0;i<m;i++)
alph[t.charAt(i)]=0;//alph['к']=0 alph['н']=1 :
//В двумерном массиве del будем хранить таблицу переходов
var del=new Array(m+1);
//WSH.echo(del);
for(var j=0;j<=m;j++)
del[j]=new Array();
//Инициализируем таблицу переходов
for(var i in alph)
del[0][i]=0;

//Формируем таблицу переходов

for(var j=0;j<m;j++){//prev=del[1][к];;;;del[1][к]=1;;;;
var prev=del[j][t.charAt(j)];
del[j][t.charAt(j)]=j+1;
for(i in alph)
del[j+1][i]=del[prev][i];
//WSH.echo(del[prev][i]);
}


// Поиск в st2 состояния |t|

var curSost=0;
for (var i=0; i<st2.length; i++)
if (typeof(del[curSost][st2.charAt(i)])!="undefined"){//Если тип двумерного массива не равен undefined
curSost=del[curSost][st2.charAt(i)];//То CurSost = двумерному массиву
if (curSost == t.length )//Если длина строки равна curSost,то вывести число первого вхождения
WSH.echo(i-t.length+" ");
}



var after = new Date();
WSH.echo(after-now);
Проблема заключается в том, допустим ищем слово "война", в тексте "вой123навойнавой34на" и получается, что он находит все три слова , хотя должен находить только то, которое по середине




© OSzone.net 2001-2012