首页 > 编程语言 > 详细

【内功】基础算法——字符串

时间:2017-02-27 10:59:37      阅读:278      评论:0      收藏:0      [点我收藏+]

 

 

[1] Manacher 

求一个字符串中的最长回文子串。

讲解直接放ppt,复习能回忆起来就行。

 

技术分享

 

技术分享

 

技术分享

 技术分享

技术分享

技术分享

 

 

 

 1 #include <iostream>
 2 #include <string>
 3 #include <vector>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 string manacher(string& s) {
 8     vector<int> p(s.size(), 0);
 9     int mx = 0, dx = 0;
10     for (auto i = 1; i < s.size(); ++i) {
11         if (mx > i) {
12             p[i] = min( p[2*dx-i] , (int)mx-i);
13         } else {
14             p[i] = 1;
15         }
16         while (s[i+p[i]] == s[i-p[i]]) {
17             p[i]++;
18         }
19         if (p[i] + i > mx) {
20             mx = p[i] + i;
21             dx = i;
22         }
23     }
24     int index = -1, max_len = -1;
25     for (auto i = 1; i < s.size(); ++i) {
26         if (p[i] > max_len) {
27             index = i;
28             max_len = p[i];
29         }
30     }
31     max_len--; // P[i]-1正好是原字符串中回文串的总长度
32     int start = index - max_len;
33     int end = index + max_len;
34     string ans = "";
35     for (int i = start; i <= end; ++i) {
36         if (s[i] != #) {
37             ans += s[i];
38         }
39     }
40 
41     cout << "s = ";
42     for (int i = 0; i < s.size(); ++i) {
43         cout << s[i] << " ";
44     }
45     cout << endl;
46     cout << "p = ";
47     for (int i = 0; i < s.size(); ++i) {
48         cout << p[i] << " ";
49     }
50     cout << endl;
51 
52     return ans;
53 }
54 
55 int main() {
56     string s;
57     cin >> s;
58     string tmp = "$#";
59     for(int i = 0; i < s.size(); ++i) {
60         tmp += s[i];
61         tmp += "#";
62     }
63     cout << tmp << endl;
64     string palindrome = manacher(tmp);
65     cout << palindrome << endl;
66     return 0;
67 }

 

【内功】基础算法——字符串

原文:http://www.cnblogs.com/zhangwanying/p/6472455.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!