Пример #1
0
        public void Build_2()
        {
            List <int> longestProperPrefixes1 = LLPPS.Build("abcdef");

            Assert.AreEqual(0, longestProperPrefixes1[0]);
            Assert.AreEqual(0, longestProperPrefixes1[1]);
            Assert.AreEqual(0, longestProperPrefixes1[2]);
            Assert.AreEqual(0, longestProperPrefixes1[3]);
            Assert.AreEqual(0, longestProperPrefixes1[4]);
            Assert.AreEqual(0, longestProperPrefixes1[5]);
        }
Пример #2
0
        public void Build_1()
        {
            List <int> longestProperPrefixes1 = LLPPS.Build("aaaabcbaab");

            Assert.AreEqual(0, longestProperPrefixes1[0]);
            Assert.AreEqual(1, longestProperPrefixes1[1]);
            Assert.AreEqual(2, longestProperPrefixes1[2]);
            Assert.AreEqual(3, longestProperPrefixes1[3]);
            Assert.AreEqual(0, longestProperPrefixes1[4]);
            Assert.AreEqual(0, longestProperPrefixes1[5]);
            Assert.AreEqual(0, longestProperPrefixes1[6]);
            Assert.AreEqual(1, longestProperPrefixes1[7]);
            Assert.AreEqual(2, longestProperPrefixes1[8]);
            Assert.AreEqual(0, longestProperPrefixes1[9]);
        }
Пример #3
0
        public void Build_3()
        {
            List <int> longestProperPrefixes1 = LLPPS.Build("ddgddcddgdd");

            Assert.AreEqual(0, longestProperPrefixes1[0]);
            Assert.AreEqual(1, longestProperPrefixes1[1]);
            Assert.AreEqual(0, longestProperPrefixes1[2]);
            Assert.AreEqual(1, longestProperPrefixes1[3]);
            Assert.AreEqual(2, longestProperPrefixes1[4]);
            Assert.AreEqual(0, longestProperPrefixes1[5]);
            Assert.AreEqual(1, longestProperPrefixes1[6]);
            Assert.AreEqual(2, longestProperPrefixes1[7]);
            Assert.AreEqual(3, longestProperPrefixes1[8]);
            Assert.AreEqual(4, longestProperPrefixes1[9]);
            Assert.AreEqual(5, longestProperPrefixes1[10]);
        }
        public static List <int> Search(string text, string pattern)
        {
            /* Starts with a preprocessing step. Get the data structure for longest proper prefix that is also a suffix. */
            List <int> longestProperPrefixLengths = LLPPS.Build(pattern);

            var indexes = new List <int>();

            int i = 0; /* Index to navigate over text */
            int j = 0; /* Index to navigate over pattern*/

            while (i < text.Length)
            {
                if (text[i] == pattern[j]) /* When there is a match*/
                {
                    i++;                   /* Continue incrementing i and j as long as characters match. */
                    j++;

                    if (j == pattern.Length) /* Means pattern is matched with text [i-pattern.Length, i-1]*/
                    {
                        indexes.Add(i - pattern.Length);

                        /* Since we are after all occurrences of pattern, continue by changing j (in naive approach after each match, this would be set to zero. )*/
                        j = longestProperPrefixLengths[j - 1]; /* Label (A) */
                    }
                }
                else  /* When there is a mismatch, stop and go backward in pattern. Note: always going forward in the text (main string) */
                {
                    if (j == 0) /* means we have navigated backward so much that j is reset to zero at this stage [reset to naive approach], and a one-to-one sequential search of pattern in text, starting at index i, starts again. */
                    {
                        i++;
                    }
                    else
                    {
                        j = longestProperPrefixLengths[j - 1]; /* Label (B)  == Label (A) */
                    }
                }
            }

            return(indexes);
        }