Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Автомат (http://forum.oszone.net/showthread.php?t=313954)

anoxina 17-04-2016 10:45 2627071

Автомат
 
Код:

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на" и получается, что он находит все три слова , хотя должен находить только то, которое по середине


Время: 13:34.

Время: 13:34.
© OSzone.net 2001-