Leetcode+牛客网—回文串总结(一)

来源:互联网 发布:美国退出qe 知乎 编辑:程序博客网 时间:2024/06/10 23:04



(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/73927815冷血之心的博客)



题目一:


       大家对回文串不陌生吧?一个字符串从前看和从后看如果一样的话,就是回文串。比如“上海自来水来自海上”就是一个回文串。现在我们的问题来了,把一个数字看成字符串,问它是不是一个回文数?这么简单的题目对想要成为小米工程师的你来说肯定不是问题。不过提醒一下哦:时间复杂度和空间复杂度越低的算法,得分越高。


常规解法:

(1)大多数人想到的肯定是现将数字转换为字符串,然后首尾进行判断比较,得出是否是回文串。

代码如下:

public boolean isPalindromeNumber(long num){        String str = num + "";        int start = 0;        int end = str.length() - 1;        while(start <= end){            char s = str.charAt(start);            char e = str.charAt(end);            if(s != e){                return false;            }else{                start++;                end--;            }        }        return true;}

高效解法:

本题在时间复杂度和空间复杂度上有所要求,所有采用将数字转换成字符串,在空间复杂度显然有点不划算,通过计算得到数字前后对应位的数字,显然要好一些(需要深厚的数学功底可怜

public static boolean isPalindromeNumber(long num){int a = (int) num;int h = 1; // h要保持和剩余的数字一样的位数        if (a < 0)         return false;        while (a / h >= 10) {            h = h * 10;        }        while (a > 0) {            if (a / h != a % 10)   // a/h可以得出首位数字; a%10则可以得出末位数字            return false;            a = a % h;  // 去除首位数字            a = a / 10; // 去除末位数字            h = h / 100;        }        return true;}


题目二:


       对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。给定字符串A以及它的长度n,请返回最长回文子串的长度。


思路:

本题使用暴力破解法,时间复杂度为O(N的立方),我们先看一种使用动态规划,使得时间复杂度降为了O(N的平方)的算法。

动态规划:分解成小问题,并且使用额外的辅助空间来完成最最优解的保存

public int getLongestPalindrome(String s, int n) {        // write code here        if(s==null||n<=0){            return 0;        }        // 字符串长度为1,则其是回文串        if(n==1){            return 1;        }        // 动态规划中,用于保存最长回文串的值,比如pair[0][1]表示从0-1的回文串长度,数组值为0表示不是回文串        int[][] pair = new int[n][n];        int max=0;  // 需要维护的max变量                for(int i=0;i<n;i++){            for(int j=0;j<=i;j++){            // 从前往后计算是否需要更新pair数组            // 当字符相等时,有两种情况需要更新pair数组:            // (1)这两个字符是挨着的,即i-j<2;            // (2)这两个字符中间的字符串是回文串,即pair[j+1][i-1]>0                if(s.charAt(i)==s.charAt(j)&&(i-j<2||pair[j+1][i-1]>0)){                    pair[j][i]=i-j+1;                    // 判断是否需要更新max变量                    if(pair[j][i]>max){                        max=pair[j][i];                    }                }            }        }        return max;    }


LeetCode原题:需要的不是最长的回文串长度,而是让你输出最长的回文串,则我们在更新max变量的时候,必须一并将其pair数组的两个下标保存,最后根据start和end变量来截取原字符串,输出最长回文子串

public String longestPalindrome(String s) {         // write code here         int len = s.length();        if(s==null||len<=0){            return null;        }        if(len==1){            return s;        }        int[][] pair = new int[len][len];        int max = 0;        int start = 0;        int end = 0;        for(int i=0;i<len;i++){            for(int j=0;j<=i;j++){                if(s.charAt(i)==s.charAt(j)&&(i-j<2||pair[j+1][i-1]>0)){                    pair[j][i]=i-j+1;                    if(pair[j][i]>max){                        max=pair[j][i];                        start = j;                        end = i;                    }                }            }        }        return s.substring(start,end+1);    }




如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~



本群给大家提供一个学习交流的平台,内设菜鸟Java管理员一枚、精通算法的金牌讲师一枚、Android管理员一枚、蓝牙BlueTooth管理员一枚、Web前端管理一枚以及C#管理一枚。欢迎大家进来交流技术。