start每次從上次的沒有重復的right+1開始。 while (right < len - 1 && s[right + 1] == s[right]) ++right; 這個循環語句是考慮有連續字符的情況,比如“cbbd”,如果沒有這個循環 那么最后找到的答案是”c”,而不是“bb”。right一直加到沒有相等字符為止(不管是奇數個bbb還是偶數個bb)都是回文。 再次考慮這個while循環的意義,如果連續字符的個數是奇數,比如說“cbbbd”,沒有這個循環的話倒也檢測得出來(從start等于2開始檢測,可以檢出中間的bbb),可是如果連續字符的個數是偶數,比如說“cbbd”,那么沒有這個循環就檢測不出來了。如果是”cbbbbd”,那么只能檢測出三個。 綜上,這個循環是很重要的。然后start每次都要在right的基礎上加1。 后半部分的代碼則很好理解了。 需要注意的是,for循環里的條件,不能將len-start>maxlen/2換成len-start>maxlen.否則的話,“kanana”返回的結果是”ana”,因為在start=3的時候len-start=3,而maxlen也等于3。 其實可以刪去len-start>maxlen/2這句話,還是可以accepted。只不過最后會浪費一些時間。 這里的len-start>maxlen/2,maxlen/2選取的也很有講究。從start開始,剩下的字符串長度就是len-start,那么可能的回文串就是兩種情況,要么是len-start(連續的字符),要么是2(len-start)-1,所以要保證len-start>maxlen,或者2(len-start)-1>maxlen。而這里實際取了比這兩個條件還要寬松的條件。也就是len-start>maxlen/2。就是為了寧愿浪費時間也不要漏掉。
新聞熱點
疑難解答