設計模式學習筆記(十五)命令模式及在Spring JdbcTemplate 中的實現
阿新 • • 發佈:2022-04-06
5. 最長迴文子串
難度中等給你一個字串 s
,找到 s
中最長的迴文子串。
示例 1:
輸入:s = "babad" 輸出:"bab" 解釋:"aba" 同樣是符合題意的答案。
示例 2:
輸入:s = "cbbd" 輸出:"bb"
提示:
1 <= s.length <= 1000
-
s
僅由數字和英文字母組成
解法: 雙指標
以圖中字串為例
1. 使用雙指標,左指標 l1 指向首 從左向右遍歷,右指標指向尾。外層while(l1 < r1)
2.如果s[l1] != s[r1],表明 l1 r1 當前不是迴文串。則 l1 位置不變, r1左移。繼續下次迴圈對比 s[l1] s[r1]是否相等
如果s[l1] == s[r1],表明,l1 rl可能是個迴文字串, 進入子while迴圈,(l2 r2 是待檢查的迴文串的左右指標),進行迴文串檢查,
3. 如果是迴文串,記錄串長,記錄l1位置,取最大的串長
4.存在一個情況就是 “aa”是迴文,“aca”也是迴文,即s[l2] == s[r2] 候,左指標右移,右指標左移,則左右指標就完美的錯過了,位置變成了 r2 l2 ,即l2 = r2+1 。
另一個情況:s[l2] == s[r2] 候,左指標右移,右指標左移 l2 == r2了。
char * longestPalindrome(char * s){ int l1,l2; int r1,r2; int len = strlen(s); int cnt = 0; int maxcnt = 0; int ll,rr; l1 = 0; r1 = len -1;while(l1 < len){ if(s[l1] != s[r1]){ r1--; if(l1 == r1){ l1++; r1 = len-1; } }else{ l2 = l1; r2 = r1; while(l2<r2){ if(s[l2]==s[r2]){ l2++; r2--; }else{ //l1++; //剛開始這塊寫錯了,如果子串不是迴文,l1的位置仍然不動,只挪動r1,右指標 r1--; break; } } if(l2 == r2 || l2 == (r2+1)){ // 針對第4 點的處理 cnt = r1-l1 +1; if(maxcnt < cnt){ maxcnt = cnt; ll = l1; rr = r1; } l1++; //如果是迴文串,左指標右移,右指標指向尾,繼續檢查剩餘字串是否有迴文串 r1 = len-1; }
} } s[ll+maxcnt] = '\0'; //截取回文串 s = s+ll; return s;
}