基本回文字符串
public class PalindromeString {
public boolean isPalindrome(String str){
if(str==null||str.length()<=1){
return true;
}
for(int i=0,j=str.length()-1;i<j;i++,j--){
if(str.charAt(i)!=str.charAt(j)){
return false;
}
}
return true;
}
}
@Test
public void test(){
System.out.println(isPalindrome("abcdcba"));
System.out.println(isPalindrome("abcdeba"));
}
回文字符串加强版
public class ValidPalindrome {
public boolean isAlpha(char c){
if((c>='0'&&c<='9')||(c>='a'&&c<='z')){
return true;
}else{
return false;
}
}
public boolean isPalindrome(String s){
if(s==null||s.length()<=1){
return true;
}
s=s.toLowerCase();
for(int i=0,j=str.length()-1;i<j;i++,j--){
while(i<j&&!isAlpha(s.charAt(i)){i++;}
while(i<j&&!isAlpha(s.charAt(j)){j--;};
if(str.charAt(i)!=str.charAt(j)){
return false;
}
}
return true;
}
}
@Test
public void test(){
System.out.println(isPalindrome("A man, a plan, a canal; Panama"));
System.out.println(isPalindrome("race a car"));
}
回文数字
/**x=1245421
*n=1245421
求整数位数方法wei()
*t=1000000=10^(wei()-1)
*利用%10求个位数字可得x/t%10求首位,n%10求末尾来判断首末两位是否相等
*/
public class PalindromeNumber{
public int wei(int x){
int count=0;
while(x>0){
x/=10;
count++;
}
return count;
}
public int pow(int m, int n){
int multy=1;
for(int i=1;i<=n;i++){
multy*=m;
}
return multy;
}
public bollean isPalindrome(int x){
if(x<0){
return false;
}else if(x<10){
return true;
}else{
int wei=wei(x);
int t=pow(10,wei-1);
int half=wei/2;
int n=x;
for(int i=0;i<half;i++){
if(x/t%10==n^10){
t/=10;
n/=10;
}else{
return false;
}
}
return true;
}
}
@Test
public void test(){
System.out.println(isPalindrome("12345654321"));
System.out.println(isPalindrome("123455432"));
}
}
最长回文子串
public class LPS{
public boolean isPalindrome(String s, int start, int end){
for(int i=start, j=end; i<j; i++,j--){
if(s.charAt(i)!=s.charAt(j)){
return false;
}
}
return true;
}
public String longestPlindrome01(String s){
if(s==null||s.length()<=1){
return s;
}else{
int n=s.length();
int max=0;
int from=0;
int to=1;
for (int i=0;i<n;i++){
for(int j=i;j<n;j++){
if(isPalindrome(s, i, j)){
if(j-i+1>=max){
max=j-i+1;
from=i;
to=j;
}
}
}
}
return s.substring(from, to+1);
}
}
public String longestPlindrome02(String s){
int maxLeft=0;
int maxRight=0;
int max=1;
int n=s.length();
for(int i=0;i<n;i++){
int start=i;
int end=i+1;
int len=0;
int left=right;
int right=end;
while(start>=0&&end<n){
if(s.charAt(start)==s.charAt(end)){
len=len+2;
left=start;
right=end;
start--;
end++;
}else{
break;
}
}
if(len>max){
maxLeft=left;
maxRight=right;
max=len;
}
start=i-1;
end=i+1;
len=1;
left=right;
right=end;
while(start>=0&&end<n){
if(s.charAt(start)==s.charAt(end)){
len=len+2;
left=start;
right=end;
start--;
end++;
}else{
break;
}
}
if(len>max){
maxLeft=left;
maxRight=right;
max=len;
}
}
return s.substring(maxLeft,maxRight+1);
}
@Test
public void test(){
System.out.println(longestPlindrome01("abcdabcdcba"));
System.out.println(longestPlindrome02("hijkhijkkji"));
}
}