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#管理一枚。欢迎大家进来交流技术。
- Leetcode+牛客网—回文串总结(一)
- 最长回文子串----leetcode每日一练
- LeetCode 336 Palindrome Pairs(回文串)
- 【leetcode】回文串划分(DFS)
- leetcode 最长回文串
- LeetCode-----回文串分割
- 牛客网编程小结(一)——回文序列
- leetcode刷题总结之“整形回文”
- 求最长回文子串(一)
- 最长回文串总结
- 回文串问题总结
- 最长回文串总结
- 回文串题目总结
- leetcode 5 最长回文串
- leetcode--5--最长回文串
- leetcode:最长回文子串
- [LeetCode]—Anagrams 回文构词法
- leetcode(5)—— Longest Palindromic Substring(最长回文子串)
- 拔盘Demo大赛,1000元现金等你拿!
- IAR开发STM8,如何加入每次编译的日期时间信息来做为版本信息
- SpringMVC学习之json数据交互
- kudu踩坑记之一
- webrtc中关于AEC,AGC,NS模块的使用总结
- Leetcode+牛客网—回文串总结(一)
- ssh文件下载与上传细节
- 【设计模式】——单例
- 为什么memset不能将数组元素初始化为1?(急)
- CentOS yum升级GCC到4.8
- MPP 架构数据库
- centos下IntelliJ IDEA运行java项目
- 宿主对象
- Json字符串与Json对象的区别