diff --git a/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h b/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h index 54a881e4c1e502a29e8fc4d377b7bc43da206e7e..6584d91ce48d697384fe3eb1c6e97efddc47401c 100644 --- a/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h +++ b/alib2algo/src/stringology/simulations/LevenshteinDynamicProgramming.h @@ -22,6 +22,8 @@ public: template <class SymbolType> static ext::vector<ext::vector<unsigned int>> compute_table(const string::LinearString<SymbolType> & text, const string::LinearString<SymbolType> & pattern); + template <class SymbolType> + static ext::set<unsigned int> search(const string::LinearString<SymbolType> & text, const string::LinearString<SymbolType> & pattern, unsigned int errors); }; #include <iostream> @@ -59,11 +61,22 @@ ext::vector<ext::vector<unsigned int>> LevenshteinDynamicProgramming::compute_ta } } - for(const auto & row : table) { - std::cout << row << std::endl; + return table; +} + +template <class SymbolType> +ext::set<unsigned int> LevenshteinDynamicProgramming::search(const string::LinearString<SymbolType> & text, const string::LinearString<SymbolType> & pattern, unsigned int errors) { + auto table = LevenshteinDynamicProgramming::compute_table(text, pattern); + + ext::set<unsigned int> result; + + for(unsigned int i = 0; i<= text.getContent().size(); i++) { + if(table[pattern.getContent().size()][i] <= errors) { + result.insert(i-1); + } } - return table; + return result; } diff --git a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp index a87f8f14cc88e6f6fbea43791ac9a859a1fd45aa..378a4b41e042f909b43ff431323dc90c3dbc796d 100644 --- a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp +++ b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.cpp @@ -23,6 +23,14 @@ void LevenshteinDynamicProgrammingTest::testTableConstruction() { CPPUNIT_ASSERT(expected_result == stringology::simulations::LevenshteinDynamicProgramming::compute_table(text, pattern)); } +void LevenshteinDynamicProgrammingTest::testSearch() { + auto text = string::LinearString<>("adcabcaabadbbca"); + auto pattern = string::LinearString<>("adbbca"); + + ext::set<unsigned int> expected_result = {2, 3, 5, 6, 7, 9, 11, 12, 13, 14}; + auto result = stringology::simulations::LevenshteinDynamicProgramming::search(text, pattern, 3); + CPPUNIT_ASSERT(expected_result == result); +} void LevenshteinDynamicProgrammingTest::setUp() { } diff --git a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.h b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.h index 6dade7594b40d27a6d3e22a4102570e67845b91f..2658bbafa6d547d120ee21f1b60a12d2de7eb4c6 100644 --- a/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.h +++ b/alib2algo/test-src/stringology/simulations/LevenshteinDynamicProgrammingTest.h @@ -6,6 +6,7 @@ class LevenshteinDynamicProgrammingTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(LevenshteinDynamicProgrammingTest); CPPUNIT_TEST(testTableConstruction); + CPPUNIT_TEST(testSearch); CPPUNIT_TEST_SUITE_END(); public: @@ -13,5 +14,6 @@ public: void tearDown ( ); void testTableConstruction(); + void testSearch(); }; #endif // LEVENSHTEIN_DYNAMIC_PROGRAMMING_TEST_H_