题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明: 本题中,我们将空字符串定义为有效的回文串。
示例1:
输入: s = “a man, a plan, a canal: Panama”
输出: true
示例2:
输入: s = “race a car”
输出: false
思路分析
我们通过题意我们可知:
- 不考虑大小写;
- 只需考虑字母与数字;
简单的思考,我们可以通过if
语句判断是否属于[a-zA-Z]
,但是这样有些繁琐,我们这里充分利用Java中String
自带的函数来进行功能实现(这也是字符串题型与链表题型的一个差异之处,字符串具有更多的可操作函数与空间):
对于要求1 不考虑大小写,则可以直接将字符串进行均小写字母化s.toLowerCase()
; 对于要求2 只考虑字母与数字,则可通过正则表达式进行范围筛选,比if
更为简洁和正规,这里我们通过将非字母和数字的字符转化为空字符来对输入字符串进行简化s.toLowerCase().relplaceAll("[^0-9a-z]", "")
解题代码
public static boolean solution(String s){
if(s == "") return true;
int len = s.length();
if(len == 1) return false;
s = s.toLowerCase().replaceAll("[^0-9a-z]", "");
len = s.length();
for(int i = 0, j = len-1; i < j; i++, j--){
if(s.charAt(i) != s.charAt(j))
return false;
}
return true;
}
复杂度分析
时间复杂度: 严格来说,我们对字符串进行了3次遍历,第一次为最小化字母;第二次为字符替换,第三次则为我们的功能循环体;但依旧为常熟级,故时间复杂度为O(N)
;
空间复杂度: 我们没有借助辅助容器,故空间复杂度为O(1)
.
常用技巧小结
String.toLowerCase()
String.replaceAll()
正则表达式
Github源码
完整可运行文件请访问GitHub。