解法一在<a>http://www.reibang.com/p/d23c6b0e02e2
中已經(jīng)寫(xiě)了破花,這個(gè)方法復(fù)雜度太高耀销,我們換一個(gè)思路:
對(duì)稱(chēng)的情況有兩種畔况,一種是奇數(shù)長(zhǎng)度的,我們?cè)谝粋€(gè)字符兩端個(gè)向兩邊延伸一個(gè)字符并判斷憋沿;
另一種是偶數(shù)長(zhǎng)度的,在確定初始位置后沪猴,也是向兩邊延伸一個(gè)字符然后判斷辐啄。
滿(mǎn)足則繼續(xù)延伸,不滿(mǎn)足移向下一個(gè)字符运嗜。
這樣判斷的復(fù)雜度降低了壶辜,O(1),遍歷復(fù)雜度還是O(N2)
int getLongestSymmetricalLength_2(char* pstring)
{
if (!pstring)
return 0;
char *pchar = pstring;//pchar moves a char one turn
int symmtricallen = 1;
int newlen = 0;
while (*pchar != '\0')
{
//1,substring with odd len
char* pfirst = pchar - 1;
char* plast = pchar + 1;
while (pfirst >= pstring&&*plast != '\0'&&*pfirst == *plast)
//這里判斷的方法很簡(jiǎn)單担租,每次只增加一個(gè)字符砸民,所以只需判斷增加的字符是否相等即可
{
pfirst--;
plast++;
}
newlen = plast - pfirst;
if (newlen > symmtricallen)
symmtricallen = newlen ;
//2,even substr len
char* pfirst = pchar;
char* plast = pchar + 1;
while (pfirst >= pstring&&*plast != '\0'&&*pfirst == *plast)
{
pfirst--;
plast++;
}
newlen = plast - pfirst;
if (newlen > symmtricallen)
symmtricallen = newlen;
pchar++;
}
return symmtricallen;
}