查找字符串的所有后缀的最长前缀字符串的长度。所有后缀的最长前缀字符串长度
对于字符串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](http://stackoverflow.com/a/8568265/1011995)是一个O(n)算法(免责声明:我没有验证算法)。 – 2012-01-05 09:16:22