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]); }
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]); }
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); }