思路:
1. 回文: 将当前string反转,其反转后的值和原先的值相等
2. 这个题中string若为空,则也为正确的回文。也可能包括符号,大小写字母,和数字,其中大小写忽略
3. 先对string做处理,将其全变成小写/大写。 然后比较string中每个字符是不是相同
4. 起点字符为string的第一个字母,终点字符为string中的最后一个字母
5. 起点应小于或等于终点
6. 若起点字符等于终点字符,则起点向右移,终点向左移。继续向中间比较
7. 若不相等,则不是一个合法的回文,返回false;
public boolean isPalindrome(String s) {
//若string为空,或长度为1,则为合理回文
if(s.length() <= 1){
return true;
}
//设置起点终点
int left = 0;
int right = s.length() - 1;
//将string做处理,其中字符全变成小写
String temp = s.toLowerCase();
//遍历string中的内容
while(left <= right){
//起点和终点字符
char l = temp.charAt(left);
char r = temp.charAt(right);
//若起点字符是符号的话
if(!Character.isLetterOrDigit(l)){
//则起点右移
left ++;
}else if(!Character.isLetterOrDigit(r)){
//若终点为符号,则终点向左移
right --;
}else{
//若起点和终点字符不相等
if(l != r){
//则不是合法回文
return false;
}
//若相等,则继续向内比较
left++;
right --;
}
}
return true;
}
思路
1. 这道题是要找出最长回文子序列
2. 依次判断string中的字符串,是不是回文
3. 有两种情况,一种为string中独立一个元素就为回文,第二种为string中的两个元素为回文
public String longestPalindrome(String s) {
if (s == null || s.length() < 1) return "";
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
//第一中情况,判断单个字符
int len1 = expandAroundCenter(s, i, i);
//第二种情况,从两个字符开始判单
int len2 = expandAroundCenter(s, i, i + 1);
//记录最长的子序列
int len = Math.max(len1, len2);
//若长度大于当前的遍历长度
if (len > end - start) {
//更新起点终点重新遍历
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
//返回起点到终点的字符串,即为最长子序列
return s.substring(start, end + 1);
}
//从中间判断是不是回文
private int expandAroundCenter(String s, int left, int right) {
int L = left, R = right;
//若为回文,及继续向两边扩展
while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
L--;
R++;
}
//返回找到的回文长度。
return R - L - 1;
}