Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
前言
力扣第125题 验证回文串 如下所示:
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明: 本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释: "amanaplanacanalpanama" 是回文串
一、思路
题目非常简短,目的也很明确:验证目标字符串是否为回文字符串
需要题目中提到的 空字符认为是有效回文串,故我们需要特殊处理空字符串。此外,我们在验证字符串的时候只考虑子母、数字,并且需要忽略字母的大小写
假设目标字符串为 回文字符串,我们从字符串的两端向中间遍历,所遍历的每个字符串都应该相同(此处的相等是指忽略大小写的相等,例如 a == A)
通过分析,很容易就能够想到使用 滑动窗口 来实现这一想法。先让滑动窗口的指向字符串的两端,然后逐步向中间靠近,直到滑动窗口的大小为 0,即滑动窗口的左端与右端相遇。
大致的步骤如下所示:
- 初始化滑动窗口,分别只想左右端
- 判断
left和right指向的字符,有如下几种情况需要特殊处理(我这里将所有的小写字母转为大写字母比较)- 存在特殊字符
- 存在小写字母()
- 窗口缩小过程中出现了不相等直接返回
false,反之返回true
二、实现
实现代码
实现代码与思路中保持一致,但是为了判断边界更容易,我包装了一个方法来判断当前字符是否为以下的情况:
- 数字
- 小写字母
- 大写字母
- 其它字符
public boolean isPalindrome(String s) {
if (s == null) // 特殊情况
return true;
int left = 0;
int right = s.length() - 1;
while (right > left){
char lc = s.charAt(left);
char rc = s.charAt(right);
int lcType = cType(lc);
int rcType = cType(rc);
// 有一个特殊字符
if (lcType < 0) {
left++;
continue;
}
if (rcType < 0) {
right--;
continue;
}
// 处理小写
if (lcType == 3) lc -= 32;
if (rcType == 3) rc -= 32;
// 如不相等,则返回false
if (lc != rc){
return false;
}
left ++;
right --;
}
return true;
}
/**
* 获取字符的类型
* 返回值介绍
* 1:48 ~ 57 为数字
* 2:65 ~ 90 为大写字母
* 3:97 ~ 122 为小写字母
* -1:其它字符
*/
public int cType(char c){
if (c >= 48 && c <= 57){
return 1;
}else if (c >= 65 && c <= 90){
return 2;
}else if (c >= 97 && c <= 122){
return 3;
} else {
return -1;
}
}
测试代码
public static void main(String[] args) {
String s = "A man, a plan, a canal: Panama";
new Number125().isPalindrome(s);
}
结果
三、总结
jym,碰到这种简单题一定要自己写哦,不可多得的打基础的机会!
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~