数据结构-Java实现-简单回文

来源:互联网 发布:mysql 创建覆盖索引 编辑:程序博客网 时间:2024/06/09 19:49

基本回文字符串

//T(N)=O(N),S(N)=O(1)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;    }}@Testpublic void test(){    System.out.println(isPalindrome("abcdcba"));    System.out.println(isPalindrome("abcdeba"));}

回文字符串加强版

//只考虑字母和数字,忽略大小写,T(N)=O(N),S(N)=O(1)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;    }}@Testpublic void test(){    System.out.println(isPalindrome("A man, a plan, a canal; Panama"));    System.out.println(isPalindrome("race a car"));}

回文数字

//不能使用数组、集合、字符串 S(N)=O(1)//负数不回文,单个数字回文/**x=1245421  *n=1245421  求整数位数方法wei()  *t=1000000=10^(wei()-1)  *利用%10求个位数字可得x/t%10求首位,n%10求末尾来判断首末两位是否相等  *///T(N)=O(N)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;    }    //穷举法暴力求解,列出所有子串依次判断    //T(N)=O(N^3),S(N)=O(1)    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);        }    }    //中心扩展法,从中间往两边读是一样的,这样只用一次遍历    //T(N)=O(N^2),S(N)=O(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);    }    //Manacher方法留白,日后再写吧,= =! T(N)=O(N)    @Test    public void test(){        System.out.println(longestPlindrome01("abcdabcdcba"));        System.out.println(longestPlindrome02("hijkhijkkji"));    }}
0 0