فهرست منبع

misc: substring: add reverse substring search functions

ambrop7 13 سال پیش
والد
کامیت
0c3691dfa1
2فایلهای تغییر یافته به همراه63 افزوده شده و 0 حذف شده
  1. 24 0
      examples/substring_test.c
  2. 39 0
      misc/substring.h

+ 24 - 0
examples/substring_test.c

@@ -176,5 +176,29 @@ int main (int argc, char *argv[])
     
     test_substring(word_len, text_len, word_count, text_count);
     
+    {
+        char text[] = "aggagaa";
+        char word[] = "aga";
+        size_t table[sizeof(word) - 1];
+        build_substring_backtrack_table(word, strlen(word), table);
+        
+        size_t pos;
+        int res = find_substring(text, strlen(text), word, strlen(word), table, &pos);
+        ASSERT_FORCE(res)
+        ASSERT_FORCE(pos == 3)
+    }
+    
+    {
+        char text[] = "aagagga";
+        char word[] = "aga";
+        size_t table[sizeof(word) - 1];
+        build_substring_backtrack_table_reverse(word, strlen(word), table);
+        
+        size_t pos;
+        int res = find_substring_reverse(text, strlen(text), word, strlen(word), table, &pos);
+        ASSERT_FORCE(res)
+        ASSERT_FORCE(res == 1)
+    }
+    
     return 0;
 }

+ 39 - 0
misc/substring.h

@@ -40,3 +40,42 @@ static int find_substring (const char *text, size_t text_len, const char *word,
     
     return 0;
 }
+
+static void build_substring_backtrack_table_reverse (const char *str, size_t len, size_t *out_table)
+{
+    ASSERT(len > 0)
+    
+    size_t x = 0;
+    
+    for (size_t i = 1; i < len; i++) {
+        out_table[i] = x;
+        while (x > 0 && str[len - 1 - i] != str[len - 1 - x]) {
+            x = out_table[x];
+        }
+        if (str[len - 1 - i] == str[len - 1 - x]) {
+            x++;
+        }
+    }
+}
+
+static int find_substring_reverse (const char *text, size_t text_len, const char *word, size_t word_len, const size_t *table, size_t *out_position)
+{
+    ASSERT(word_len > 0)
+    
+    size_t x = 0;
+    
+    for (size_t i = 0; i < text_len; i++) {
+        while (x > 0 && text[text_len - 1 - i] != word[word_len - 1 - x]) {
+            x = table[x];
+        }
+        if (text[text_len - 1 - i] == word[word_len - 1 - x]) {
+            if (x + 1 == word_len) {
+                *out_position = (text_len - 1 - i);
+                return 1;
+            }
+            x++;
+        }
+    }
+    
+    return 0;
+}