最土的On方法,就是设两个pivot代表中间的对称点. 这个点可以是个区间。基本就两
种情况比如 4311134,对称点就是111,或者43134对称点就是313,然后从这个对称区
间往两边扩展match,一旦发现不match就放弃当前pivot。
#include
#include
using namespace std;
vector findFristPal(vector& src)
{
int srcSize = src.size();
if (srcSize==0) return vector();
if (srcSize<=1) return vector(src[0],1);
bool isMatching = false;
int pivotLeft = 0;
int pivotRight = 0;
for (int i=1; i{
if (!isMatching)
{
if(src[i]==src[i-1])
{
isMatching = true;
pivotLeft = i-1;
pivotRight = i;
}
else if (i>1 && src[i]==src[i-2])
{
isMatching = true;
pivotLeft = i-2;
pivotRight = i;
}
if (isMatching && i==srcSize-1)
return vector(src.begin(), src.begin()+i+1);
}
else
{
// extend pivot if possible
if (i==pivotRight+1 && src[i] == src[pivotRight])
{
pivotRight++;
continue;
}
// give up the current pivots if found unmatch
if(src[i]!=src[pivotLeft-(i-pivotRight)])
{
isMatching=false;
continue;
}
// output if the match of 1st element found
if(i-pivotRight == pivotLeft)
{
return vector(src.begin(), src.begin()+i+1);
}
}
}
return vector();
}