zoukankan      html  css  js  c++  java
  • 最长回文字符串问题,解决方案

     1.暴力匹配法+剪枝操作

        //从当前位置出发,从后向前找
        //找的位置跨度不能小于maxLength 因为小于它的话,即使是,也不是最长的了
        //此定义为暴力匹配法,虽然经剪枝操作,时间复杂度也仍为n^3
        public String longestPalindrome(String s) {
            if(s==null||s.length()==0){
                return "";
            }
            HashMap<Integer,String> hash=new HashMap<>();
            int maxLength=1;
            hash.put(1,s.charAt(0)+"");
            for (int i = 0; i < s.length()-maxLength; i++) {
                for (int j = s.length()-1; j>i; j--) {
                    if(j-i+1<=maxLength){//当前说明跨度已经不大于最大长度了,也就没有必要在继续了
                        break;
                    }
                   if(s.charAt(j)==s.charAt(i)){
                       if(isRoundStr(s,i,j)){
                           maxLength=j-i+1;
                           hash.put(maxLength,s.substring(i,j+1));
                           break;
                       }
                   }
                }
            }
            return hash.get(maxLength);
        }
        private boolean isRoundStr(String s,int leftIndex,int rightIndex){
            while (leftIndex<rightIndex){
                if(s.charAt(leftIndex)!=s.charAt(rightIndex)){
                    return false;
                }
                leftIndex++;
                rightIndex--;
            }
            return true;
        }

    2.中心法

     public String longestPalindrome(String s){
            if(s.length()<2){
                return s;
            }
            int begin=0,maxLength=1;
            int len1,len2,len;
            for (int i = 0; i < s.length()-1; i++) {
                //奇数个,与,偶数个
                len1=expendStr(s,i,i);
                len2=expendStr(s,i,i+1);
                len=len1>len2?len1:len2;
                if(len>maxLength){
                    maxLength=len;
                    begin=i-(maxLength-1)/2;
                }
            }
            return s.substring(begin,begin+maxLength);
        }
        private int expendStr(String s,int left,int right){
            while (left>=0&&right<=s.length()-1){
                if(s.charAt(left)==s.charAt(right)){
                    left--;
                    right++;
                }else {
                    break;
                }
            }
            //当前到达的位置是不匹配的位置 right-left+1-2
            return right-left-1;
        }

    3.动态规划

     就是按照递归的思路,但是转换成空间来记录的形式完成,记住!这就是动态规划

     //动态规划,时间复杂度也是n^2
        //a b c b a ;  dp[i][j]=s[i]==s[j]&&(dp[i+1][j-1]||j-i<=2)
        public String longestPalindrome3(String s){
            if(s.length()<2){
                return s;
            }
            int begin=0,maxLength=1;
            //i是左边索引,j是右边索引,由此可见我们构建的使用的是上三角形
            boolean[][] dp=new boolean[s.length()][s.length()];
            //对角线全为true
            for (int i = 0; i < s.length(); i++) {
                dp[i][i]=true;
            }
            //由公式dp[i][j]=s[i]==s[j]&&(dp[i+1][j-1]||j-i<=2)知本次的我们需要使用本节点的左下角的判断,因此我们一列一列构架
            //中间对角线位置及dp[0][0] dp[1][1]...这些位置值都为true
            for (int j = 1; j < dp.length; j++) {//j代表列,i代表行
                for (int i = 0; i < j; i++) {
                    if(s.charAt(i)==s.charAt(j)){
                        if(j-i<=2||dp[i+1][j-1]){
                            dp[i][j]=true;
                        }
                    }
                    if(dp[i][j]&&j-i+1>maxLength){
                        begin=i;
                        maxLength=j-i+1;
                    }
                }
            }
            return s.substring(begin,begin+maxLength);
        }
  • 相关阅读:
    50 +漂亮的网站的配色方案(下)
    分享一款jQuery的UI插件:Ninja UI
    让代码飞一会儿:快速编写 HTML 和 CSS 的工具和技术
    30 +最佳移动网络设计灵感的案例
    50 +漂亮的网站的配色方案(上)
    20+ 个很棒的 jQuery 文件上传插件或教程
    23个全屏照片为背景的网站
    20个值得开发人员关注的jQuery技术网站和博客
    20张图,让你看清2012移动互联网大方向
    7 款仿照 Sinatra 思路的 .NET 框架
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/13167335.html
Copyright © 2011-2022 走看看