1. 程式人生 > >214. Shortest Palindrome

214. Shortest Palindrome

left 比較 技術 max 下標 lin tostring 是否 arr

一、題目

  1、審題

  技術分享圖片

  2、分析

    給出一個字符串,在此字符串前邊添加字符,使得其成為一個回文,求添加最少字符後,所形成的回文。

二、解答

  1、思路:

    ①、為了處理回文字符數為奇數和偶數的問題,先在字符串 s 的每一個字符之間插入字符 ‘#‘,並將每個字符放入一個 List 中

    ②、下標 index 依次從 1 到 mid,定義兩個指針 left = index - 1、right = index + 1;

      比較 left 、right 所指元素是否相等,若不相等,則 index 向後移動,若相等,則 left、right相反移動,直到 left < 0,此時,即為以 index 為中心,形成的字符串為回文。記錄最大的回文中心的字符下標 index

    ③、將 ②所求得的最大 index 為中心的字符串所不包含的 s 的後部分子字符串逆序插入一個 StringBuilder 中,並將 s 插入 此 StringBuilder 中,返回。

 1    public String shortestPalindrome(String s) {
 2         
 3         List<Character> list = new ArrayList<>();
 4         list.add(‘#‘);
 5         for(char c: s.toCharArray()) {
 6             list.add(c);
7 list.add(‘#‘); 8 } 9 10 int len = list.size(); 11 int mid = (len - 1) / 2; 12 int i = 1; 13 int max = 0; 14 while(i <= mid) { 15 int left = i - 1; 16 int right = i + 1; 17 while(left >= 0 && right <= len - 1) {
18 if(list.get(left) != list.get(right)) 19 break; 20 left--; 21 right++; 22 } 23 if(left <= 0) 24 max = i; 25 i++; 26 } 27 max = max * 2 + 1; 28 StringBuilder sb = new StringBuilder(); 29 for (int j = len - 1; j >= max; j--) { 30 if(list.get(j) != ‘#‘) 31 sb.append(list.get(j)); 32 } 33 sb = sb.append(s); 34 return sb.toString(); 35 }

214. Shortest Palindrome