【发布时间】:2012-01-05 08:13:59
【问题描述】:
找出字符串所有后缀的最长前缀字符串的长度。
例如字符串ababaa的后缀是ababaa、babaa、abaa、baa、aa和a。这些字符串中的每一个与字符串“ababaa”的相似度分别为 6,0,3,0,1,1。因此答案是 6 + 0 + 3 + 0 + 1 + 1 = 11。
我写了以下代码
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <time.h>
int main ( int argc, char **argv) {
size_t T;
std::cin >> T;
char input[100000];
for ( register size_t i = 0; i < T; ++i) {
std::cin >> input;
double t = clock();
size_t len = strlen(input);
char *left = input;
char *right = input + len - 1;
long long sol = 0;
int end_count = 1;
while ( left < right ) {
if ( *right != '\0') {
if ( *left++ == *right++ ) {
sol++;
continue;
}
}
end_count++;
left = input; // reset the left pointer
right = input + len - end_count; // set right to one left.
}
std::cout << sol + len << std::endl;
printf("time= %.3fs\n", (clock() - t) / (double)(CLOCKS_PER_SEC));
}
}
工作正常,但是对于一个长度为100000 且具有相同字符(即aaaaaaaaaa.......a)的字符串,它需要很长时间,我该如何进一步优化它。
【问题讨论】:
-
这似乎是一个惊人的普遍问题。 Here 是一个 O(n) 算法(免责声明:我还没有验证算法)。
标签: c++ algorithm data-structures