[LeetCode 214] Shortest Palindrome
2015-10-05 13:40
211 查看
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
Given
Solution:
1. O(n * lgn)
check if substring(0, end) is palindrome or not, end from s.length() to 1. If is palindrome, reverse substring(end, length()) + s
this solution will LSE
public String shortestPalindrome(String s) {
if(s.length() <=1) return s;
int right = s.length();
for(int i = right-1; i>=0; i--) {
if(isPalindrome(s, i)) {
StringBuilder sb = new StringBuilder(s.substring(i+1));
sb.reverse();
return sb.toString() + s;
}
}
return "";
}
public boolean isPalindrome(String s, int right) {
int left = 0;
while(left<=right) {
if(s.charAt(left) != s.charAt(right)) return false;
right--;
left++;
}
return true;
}
2. Improve from middle search, O(logn * logn)
public String shortestPalindrome(String s) {
if(s.length() <=1) return s;
int center = (s.length() - 1) /2;
String res = "";
for(int i = center; i>=0; i--) {
if(s.charAt(i) == s.charAt(i+1)){
if((res = isPalindrome(s, i, i+1)) != null) return res;
}
if((res = isPalindrome(s, i, i)) != null) return res;
}
return res;
}
public String isPalindrome(String s, int left, int right) {
int i = 1;
for(;left-i>=0 && right+i< s.length(); i++) {
if(s.charAt(left-i) != s.charAt(right+i)) break;
}
if(left-i>=0) return null;
StringBuilder sb = new StringBuilder(s.substring(right+i));
sb.reverse();
return sb + s;
}
For example:
Given
"aacecaaa", return
"aaacecaaa".
Given
"abcd", return
"dcbabcd".
Solution:
1. O(n * lgn)
check if substring(0, end) is palindrome or not, end from s.length() to 1. If is palindrome, reverse substring(end, length()) + s
this solution will LSE
public String shortestPalindrome(String s) {
if(s.length() <=1) return s;
int right = s.length();
for(int i = right-1; i>=0; i--) {
if(isPalindrome(s, i)) {
StringBuilder sb = new StringBuilder(s.substring(i+1));
sb.reverse();
return sb.toString() + s;
}
}
return "";
}
public boolean isPalindrome(String s, int right) {
int left = 0;
while(left<=right) {
if(s.charAt(left) != s.charAt(right)) return false;
right--;
left++;
}
return true;
}
2. Improve from middle search, O(logn * logn)
public String shortestPalindrome(String s) {
if(s.length() <=1) return s;
int center = (s.length() - 1) /2;
String res = "";
for(int i = center; i>=0; i--) {
if(s.charAt(i) == s.charAt(i+1)){
if((res = isPalindrome(s, i, i+1)) != null) return res;
}
if((res = isPalindrome(s, i, i)) != null) return res;
}
return res;
}
public String isPalindrome(String s, int left, int right) {
int i = 1;
for(;left-i>=0 && right+i< s.length(); i++) {
if(s.charAt(left-i) != s.charAt(right+i)) break;
}
if(left-i>=0) return null;
StringBuilder sb = new StringBuilder(s.substring(right+i));
sb.reverse();
return sb + s;
}
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- android上改变listView的选中颜色
- String.intern
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- PostgreSQL ERROR: invalid escape string 解决办法
- 浅谈C++中的string 类型占几个字节
- 标准C++类string的Copy-On-Write技术
- C++实现string存取二进制数据的方法
- C#中string和StingBuilder内存中的区别实例分析
- PHP STRING 陷阱原理说明
- c#中 String和string的区别介绍
- C#实现的图片、string相互转换类分享
- asp.net String.IsNullOrEmpty 方法
- JavaScript中字符串(string)转json的2种方法
- C#中string用法实例详解
- C#中的DataSet、string、DataTable、对象转换成Json的实现代码
- JavaScript中的object转换成number或string规则介绍