- 课堂交流区
- 帖子详情
置顶
讨论KMP.2 如何修改 KMP 函数,使其与 strstr 有一致的接口?
<p>原始的 KMP 函数返回的是模式在文本中的首字母下标,这使我们不得不改变结果输出的格式。如果我们希望在调用了</p><p><code class="brush:cpp;toolbar:false">Position p = KMP(string, pattern);</code>之后,仍然用</p><p><code class="brush:cpp;toolbar:false">printf("%s\n", p);</code>输出,该怎样修改 KMP 函数?</p><p><br/></p>
89
回复
-
<p>要让 KMP 函数返回模式在文本中的子串,可以修改函数的返回类型为字符串类型。同时,在 KMP 函数内部要记录子串在文本中的起始和终止下标,然后返回这个子串。下面是一个简单的修改版本:</p><p><br ></p><p><br ></p><p>#include <iostream></p><p>#include <cstring></p><p>using namespace std;</p><p><br ></p><p>string KMP(string text, string pattern)</p><p>{</p><p> int tlen = text.size();</p><p> int plen = pattern.size();</p><p> int fail[plen + 1];</p><p> memset(fail, -1, sizeof(fail));</p><p><br ></p><p> for (int j = 1; j < plen; ++j) {</p><p> int i = fail[j - 1];</p><p> while (pattern[j] != pattern[i + 1] && i >= 0) i = fail[i];</p><p> if (pattern[j] == pattern[i + 1]) fail[j] = i + 1;</p><p> }</p><p><br ></p><p> int i = 0, j = 0;</p><p> while (i < tlen && j < plen) {</p><p> if (text[i] == pattern[j]) {</p><p> ++i; ++j;</p><p> } else if (j == 0) {</p><p> ++i;</p><p> } else {</p><p> j = fail[j - 1] + 1;</p><p> }</p><p> }</p><p><br ></p><p> if (j == plen) {</p><p> return text.substr(i - plen, plen);</p><p> } else {</p><p> return "not found";</p><p> }</p><p>}</p><p><br ></p><p>int main()</p><p>{</p><p> string text = "ABCABCABCABD";</p><p> string pattern = "ABCABD";</p><p> cout << KMP(text, pattern) << endl; // output: ABCABD</p><p> return 0;</p><p>}</p><p><br ></p><p>在 main 函数里,我们用 cout 输出 KMP 函数返回的字符串。这样,就可以在调用 KMP 函数后方便地输出子串了。</p><p><br ></p>添加评论
-
通过学习该门课程,我学习到了很多有关于该门课程的知识,很大程度上提升的我对该领域的兴趣,加强了课外兴趣,培养了创新能力,学到了很多知识,收获颇多!!!!添加评论
-
通过学习该门课程,我学习到了很多有关于该门课程的知识,很大程度上提升的我对该领域的兴趣,加强了课外兴趣,培养了创新能力,学到了很多知识,收获颇多!!!!添加评论
-
1添加评论
-
1添加评论
-
1添加评论
-
1添加评论
-
1添加评论
-
通过学习该门课程,我学习到了很多有关于该门课程的知识,很大程度上提升的我对该领域的兴趣,加强了课外兴趣,培养了创新能力,学到了很多知识,收获颇多!!!!添加评论
-
通过学习该门课程,我学习到了很多有关于该门课程的知识,很大程度上提升的我对该领域的兴趣,加强了课外兴趣,培养了创新能力,学到了很多知识,收获颇多!!!!添加评论
-
通过学习该门课程,我学习到了很多有关于该门课程的知识,很大程度上提升的我对该领域的兴趣,加强了课外兴趣,培养了创新能力,学到了很多知识,收获颇多!!!!添加评论
-
通过学习该门课程,我学习到了很多有关于该门课程的知识,很大程度上提升的我对该领域的兴趣,加强了课外兴趣,培养了创新能力,学到了很多知识,收获颇多!!!!添加评论
点击加载更多
到底啦~