• Leetcode: Shortest Palindrome


    Given a string S, you are allowed to convert it to a palindrome by adding characters in front of it. Find and return the shortest palindrome you can find by performing this transformation.
    
    For example:
    
    Given "aacecaaa", return "aaacecaaa".
    
    Given "abcd", return "dcbabcd".

    本题最简单的思路是从后往前判断子串是否是回文串,然后把后面的弄到前面即可,不过这样仅仅能擦边通过测试

    Brute Force: O(N^2), space O(1)

     1 public class Solution {
     2     public String shortestPalindrome(String s) {
     3         if (s==null || s.length()==0) return "";
     4         char[] arr = s.toCharArray();
     5         StringBuffer res = new StringBuffer();
     6         for (int i=arr.length-1; i>=0; i--) {
     7             if (isPalin(arr, 0, i)) {
     8                 res = new StringBuffer(s.substring(i+1));
     9                 res = res.reverse();
    10                 break;
    11             }
    12         }
    13         res.append(s);
    14         return res.toString();
    15     }
    16     
    17     public boolean isPalin(char[] arr, int l, int r) {
    18         while (l < r) {
    19             if (arr[l] != arr[r]) return false;
    20             l++;
    21             r--;
    22         }
    23         return true;
    24     }
    25 }

    DP: O(N^2), space O(N^2)

     1 public class Solution {
     2     public String shortestPalindrome(String s) {
     3         //if (s==null || s.length()==0) return "";
     4         boolean[][] dict = new boolean[s.length()][s.length()];
     5         getdict(s, dict);
     6         int i = 0;
     7         for (i=s.length()-1; i>=0; i--) {
     8             if (dict[0][i]) break;
     9         }
    10         StringBuffer res = new StringBuffer(s.substring(i+1));
    11         res = res.reverse();
    12         res.append(s);
    13         return res.toString();
    14     }
    15     
    16     public void getdict(String s, boolean[][] dict) {
    17         for (int i=s.length()-1; i>=0; i--) {
    18             for (int j=i; j<s.length(); j++) {
    19                 if (s.charAt(i)==s.charAt(j) && (j-i<=2 || dict[i+1][j-1]))
    20                     dict[i][j] = true;
    21             }
    22         }
    23     }
    24 }

    KMP介绍:http://kb.cnblogs.com/page/176818/

    实现:http://www.cnblogs.com/tonyluis/p/4474658.html

    本题KMP:(未深究)参考:http://blog.csdn.net/pointbreak1/article/details/45931551

     1 public class Solution {
     2     public String shortestPalindrome(String s) {
     3         String result = "";
     4         if(s.length() == 0)
     5             return result;
     6         int[] prefix = new int[s.length() * 2];
     7         String mirror = s + new StringBuilder(s).reverse().toString();
     8         for(int i = 1; i < s.length() * 2; i++) {
     9             int j = prefix[i-1];
    10             while(mirror.charAt(j) != mirror.charAt(i) && j > 0)
    11                 j = prefix[j-1];
    12             if(mirror.charAt(i) == mirror.charAt(j))
    13                 prefix[i] = j + 1;
    14             else
    15                 prefix[i] = 0;
    16         }
    17         int count = s.length() - prefix[s.length() * 2 -1];
    18         result = new StringBuilder(s.substring(s.length()-count, s.length())).reverse().toString() + s;
    19         return result;
    20     }
    21 }
  • 相关阅读:
    Xshell6提示“要继续使用此程序,您必须应用最新的更新或使用新版本”的解决办法
    设置UIImage的边框和圆角大小以及颜色
    CATransition使用
    [转]C/C++中extern关键字详解
    New ipad与ipad2有何不同
    使用Xcode收藏自己常用的代码模板
    objectivec 关于 self 的用法总结
    查找 EXC_BAD_ACCESS 问题根源的方法
    结构体的对齐方式
    添加three20模板的方法
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5054110.html
Copyright © 2020-2023  润新知