214. Shortest Palindrome
阿新 • • 發佈:2018-11-01
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