
链接:
题解:



- class Solution {
- public:
- string longestPrefix(string s) {
- if (s.size() <= 0) {
- return "";
- }
- int MOD = 1e9 + 7;
- // 构建26的n次方,预处理
- std::vector<long> pow26(s.size());
- pow26[0] = 1;
- for (int i = 1; i < pow26.size(); ++i) {
- pow26[i] = (pow26[i-1] * 26)%MOD;
- }
- // 构建前向hash
- std::vector<long> prefix_hash(s.size());
- prefix_hash[0] = s[0] - 'a';
- for (int i = 1; i < prefix_hash.size(); ++i) {
- prefix_hash[i] = (prefix_hash[i-1] * 26 + (s[i]- 'a')) % MOD;
- }
- // 构建后面的hash
- std::vector<int> post_hash(s.size());
- post_hash[s.size()-1] = s[s.size()-1] - 'a';
- for (int i = s.size()-2; i >= 0; --i) {
- post_hash[i] = ((s[i] - 'a') * pow26[s.size()-i-1] + post_hash[i+1])%MOD;
- }
- for (int len = s.size()-1; len >= 1; --len) {
- // 判断字符串是否相等
- if (prefix_hash[len-1] == post_hash[s.size()-len] &&
- equal(s, 0, len-1 , s.size() - len, s.size()-1)) {
- return s.substr(0, len);
- }
- }
- return "";
- }
- private:
- bool equal(const std::string& a, int l1, int r1, int l2, int r2) {
- for (; l1 <= r1 && l2 <= r2; ++l1, ++l2) {
- if (a[l1] != a[l2]) {
- return false;
- }
- }
- return true;
- }
- };