码迷,mamicode.com
首页 > 其他好文 > 详细

214. Shortest Palindrome

时间:2018-11-01 01:02:29      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:arraylist   字符串   pen   character   stp   rac   lin   相等   问题   

一、题目

  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

标签:arraylist   字符串   pen   character   stp   rac   lin   相等   问题   

原文地址:https://www.cnblogs.com/skillking/p/9886420.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!