Я пытаюсь решить проблему с самым коротким подбором подборов с использованием алгоритма kmp , но мой код не возвращает правильные результаты .
подход:
[*] Я разделял шаблон p на три части на основе двух '*' < /code> символы.
[*] Я использую kmp (knuth-morris-pratt algorithm) , чтобы найти вхождения этих трех частей в s .
Затем я пытаюсь найти самую короткую подборинг в s , которая содержит все три части в правильном порядке.
< /ol>
выпуск: < /h3>
Функция не всегда возвращает правильный ответ. < /li>
Иногда он возвращает -1 , когда существует действительная подстрока.
Я подозреваю >
< /ul>
Может ли кто -нибудь помочь мне определить, что не так с моим подходом? class = "lang-cpp prettyprint-override">
Я пытаюсь решить проблему с самым коротким подбором подборов с использованием алгоритма [b] kmp [/b], но мой код [b] не возвращает правильные результаты [/b]. подход:
[*] Я разделял шаблон p на [b] три части [/b] на основе двух '*' < /code> символы. [*] Я использую [b] kmp (knuth-morris-pratt algorithm) [/b], чтобы найти вхождения этих трех частей в s . Затем я пытаюсь найти самую короткую подборинг в s , которая содержит все три части в правильном порядке. < /ol> выпуск: < /h3> [list] [*] Функция не всегда возвращает правильный ответ. < /li> Иногда он возвращает -1 , когда существует действительная подстрока. [*] Я подозреваю > < /ul> Может ли кто -нибудь помочь мне определить, что не так с моим подходом? class = "lang-cpp prettyprint-override">[code]class Solution { public: void calculateLPS(string& needle, vector& lps) { int m = needle.size(); lps[0] = 0; int len = 0; int i = 1; while (i < m) { if (needle[i] == needle[len]) { len++; lps[i] = len; i++; } else { if (len != 0) { len = lps[len - 1]; } else { lps[i] = 0; i++; } } } }
vector kmp(string& haystack, string& needle) { int m = needle.size(); int n = haystack.size(); if (m > n) return {}; vector lps(m, 0); calculateLPS(needle, lps); int i = 0, j = 0; vector ans; while (i < n) { if (haystack[i] == needle[j]) { i++; j++; } if (j == m) { ans.push_back(i - j); j = lps[j - 1]; } else if (i < n && haystack[i] != needle[j]) { if (j != 0) { j = lps[j - 1]; } else { i++; } } } return ans; }
int shortestMatchingSubstring(string s, string p) { int j = 0; vector strs(3, ""); for (int i = 0; i < p.size(); i++) { if (p[i] != '*') { strs[j].push_back(p[i]); } else if (p[i] == '*') { j++; } }
Функция должна вернуть длину самой короткой подстроки < /strong> в s [/code], который соответствует p с учетом '*' как подстановочный знак. . < /li> < /ul> Пример тестового примера: < /h3> [code]string s = "abaacbaecebce"; string p = "ba*c*ce"; Solution sol; cout [b] Я правильно обращаюсь с показателями при проверке самой короткой подстроки? < /strong> < /li> Отсутствует? [/b] [/list]