您的位置:首页 > 其它

Leetcode: Shortest Palindrome

2015-12-17 14:43 363 查看
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".


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

Big case 会MLE:

public class Solution {
public String shortestPalindrome(String s) {
//if (s==null || s.length()==0) return "";
boolean[][] dict = new boolean[s.length()][s.length()];
getdict(s, dict);
int i = 0;
for (i=s.length()-1; i>=0; i--) {
if (dict[0][i]) break;
}
StringBuffer res = new StringBuffer(s.substring(i+1));
res = res.reverse();
res.append(s);
return res.toString();
}

public void getdict(String s, boolean[][] dict) {
for (int i=s.length()-1; i>=0; i--) {
for (int j=i; j<s.length(); j++) {
if (s.charAt(i)==s.charAt(j) && (j-i<=2 || dict[i+1][j-1]))
dict[i][j] = true;
}
}
}
}


Big case 会TLE:

public String shortestPalindrome(String s) {
for(int i=s.length();i>=1;i--)
if(isPalindrome(s.substring(0, i)))
return new StringBuilder(s.substring(i)).reverse()+s;
return "";
}
static boolean isPalindrome(String s){
int left=0,right=s.length()-1;
while(left<right)
if(s.charAt(left++)!=s.charAt(right--))
return false;
return true;
}


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

实现:/article/6566091.html

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

public class Solution {
public String shortestPalindrome(String s) {
String result = "";
if(s.length() == 0)
return result;
int[] prefix = new int[s.length() * 2];
String mirror = s + new StringBuilder(s).reverse().toString();
for(int i = 1; i < s.length() * 2; i++) {
int j = prefix[i-1];
while(mirror.charAt(j) != mirror.charAt(i) && j > 0)
j = prefix[j-1];
if(mirror.charAt(i) == mirror.charAt(j))
prefix[i] = j + 1;
else
prefix[i] = 0;
}
int count = s.length() - prefix[s.length() * 2 -1];
result = new StringBuilder(s.substring(s.length()-count, s.length())).reverse().toString() + s;
return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: