leetcode 5
题目描述:
(最长回文子串)给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
解题思路
1.看到回文子串和回文数等回文问题,首先想到中心扩散法,即遍历每一个元素。
2.遍历元素时要判断当前元素与下一元素是否相等,不相等的话,此回文串的长度为奇数,否则为偶数。
3.比较以每一个元素为中心组成的最大回文串长度,选择长度最长的即可。
参考代码
class Solution {
public String longestPalindrome(String s) {
if (s == null || s.length() < 1) {
return "";
}
// 初始化最大回文子串的起点和终点
int start = 0;
int end = 0;
// 遍历每个位置,当做中心位
for(int i= 0;i<s.length();i++){
// 分别拿到奇数偶数的回文子串长度
int len = get(s,i,i);
int len1 = get(s,i,i+1);
// 对比最大的长度
int l=Math.max(len,len1);
// 计算对应最大回文子串的起点和终点
if(l>end-start){
start = i - (l - 1) / 2;
end = i + l / 2;
}
}
// 注意:这里的end+1是因为 java自带的左闭右开的原因
return s.substring(start, end + 1);
}
public int get(String s ,int left,int right){
while(left>=0 && right<s.length() && s.charAt(left)==s.charAt(right)){
// left = right 的时候,此时回文中心是一个字符,回文串的长度是奇数
// right = left + 1 的时候,此时回文中心是一个空隙,回文串的长度是偶数
// 跳出循环的时候恰好满足 s.charAt(left) != s.charAt(right)
--left;
++right;
}
// 回文串的长度是right-left+1-2 = right - left - 1
return right-left-1;
}
}
leetcode 9
题目描述:
(回文数)给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true。
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
解题思路
1.首先是回文数问题,此题为判断是否为回文数,首先想到中心扩散法,即遍历每一个元素。
2.从两边往中间移动,两边元素挨个对比,只要有一对不相等即返回FALSE,否则继续往中心移动,直到结束返回true。(过程选择双指针)
3.因数数字没有按位置取元素,因此需要先将数字转为字符串或数组。
参考代码
class Solution {
public boolean isPalindrome(int x) {
if(x<0) return false;
if(x%10==0&& x!=0) return false;
String s = Integer.toString(x);//x.toString是错的
int start=0;
int end=s.length()-1;
for(int i=0;i<=s.length()/2;i++){
if(s.charAt(start) ==s.charAt(end)){
start++;
end--;
}else{
return false;
}
}
return true;
}
}