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

(尊重劳动成果,转载请注明出处: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;i0
	                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;i0)){
		                    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#管理一枚。欢迎大家进来交流技术。

 

 

你可能感兴趣的:(面试题,笔试题,LeetCode)