查找最長迴文子串用暴力解的話時間複雜度 O(n^2) ,利用 Mannacher 算法實現時間複雜度爲 O(n) 。其思想主要是利用迴文結構的對稱性來解決,類似於用表的方式紀錄信息,避免重複計算。
#include<iostream>
#include<string>
#include<assert.h>
using namespace std;
int getLen(string s2, int n)
{
int len = 0;
while (n - len >= 0 && n + len <= s2.length())
{
if (s2[n - len] != s2[n + len])
{
break;
}
len++;
}
return len;
}
int main()
{
string s1 = "abcdcbdbcdcbdbcd";
string s2 = "#";
for (int i = 0; i < s1.length(); i++)
{
s2 += s1[i];
s2 += "#";
}
int* count = new int[s2.length()];
int i = 0;
int right = -1;
int mid = -1;
while (i < s2.length())
{
if (i > right) // 第一種情況
{
count[i] = getLen(s2, i);
right += count[i];
mid = i;
}
else
{
if (count[2 * mid - i] + i -1 > right) // 第三種情況
{
count[i] = right - i;
}
else if (count[2 * mid - i] + i -1 == right) // 第四種情況
{
count[i] = getLen(s2, i);
mid = i;
}
else
{
count[i] = count[2 * mid - i]; // 第二種情況
}
}
i++;
}
cout << "暴力求解:" << endl;
for (int i = 0; i < s2.length(); i++)
{
cout << getLen(s2, i) << " ";
}
cout << endl;
cout << "Mannacher算法:" << endl;
for (int i = 0; i < s2.length(); i++)
{
cout << count[i] << " ";
}
cout << endl;
system("pause");
return 0;
}