# Leetcode 125. 验证回文串
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
1、题目📑
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
**说明:**本题中,我们将空字符串定义为有效的回文串。
实例1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
实例2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
限制:
1 <= s.length <= 2 * 105- 字符串
s由 ASCII 字符组成
2、思路🧠
方法一:双指针
- 将字符串统一字符小写,全部转为小写字母
- 使用双指针,一个字符串头部,一个字符串尾部,进行比较
- 循环判断
- 如果字符串为数字或者为小写字母,则进行比较
- 否则
字符串头部后移操作,字符串尾部前移操作 - 发现一个条件不满足直接返回false
- 如果以上条件都判断完成,结束循环,则为符合条件,返回
true。
方法二:java内置API进行操作,reverse反转判断
- 循环遍历并判断:依次取得每个字符串得单个字符
- 判断该字符是否是小写字母或者数字,满足条件则通过
StringBuffer的append()进行追加。 - 判断该字符是否是大写字母,满足条件则通过
Character.toLowerCase(c)转化为小写,通过StringBuffer的append()进行追加。
- 判断该字符是否是小写字母或者数字,满足条件则通过
- 将得到新的字符串保存
- 对新的字符串进行反转操作,对两次的字符串进行
compareTo操作。
废话少说~~~~~上代码!
3、代码👨💻
第一次commit AC
class Solution {
public boolean isPalindrome(String s) {
s = s.toLowerCase();
int l = s.length();
int i = 0,j = l - 1;
while(i <= j) {
char ci = s.charAt(i);
char cj = s.charAt(j);
if(!(Character.isDigit(ci) || (ci >= 'a' && ci <= 'z'))) {
i++;continue;
}
if(!(Character.isDigit(cj) || (cj >= 'a' && cj <= 'z'))){
j--;continue;
}
if(ci != cj) return false;
i++;
j--;
}
return true;
}
}
时间复杂度:O(N) N 为是字符串的长度
空间复杂度:O(1)
第二次commit AC
class Solution {
public boolean isPalindrome(String s) {
StringBuffer sb = new StringBuffer();
for(int i = 0; i < s.length() - 1; i++) {
char c = s.charAt(i);
if(Character.isDigit(c) || Character.isLowerCase(c)) {
sb.append(c);
}else if (Character.isUpperCase(c)){
sb.append(Character.toLowerCase(c));
}
}
String new_String = sb.toString();
String reverse_String = new StringBuilder(new_String).reverse().toString();
return (new_String.compareTo(reverse_String) == 0);
}
}
时间复杂度:O(N) N 为是字符串的长度
空间复杂度:O(N)
4、总结
该题目的对字符串的判断,清楚字符串的各种api操作,并且熟练运用进行字符串和字符的灵活变换操作。
字符串常用API
| 方法 | 描述 |
|---|---|
| public String substring(int beginIndex, int endIndex) | 截取一串字符串的一串子字符串,从from位置的字母(包括from)到end(不包括end位置)的字符串。 |
| Integer.valueOf(str); | 字符串不能强转为int型,需要通过Integer.valueOf();转换为int型 |
| public String trim() | 去除字符串开头和结尾的空字符(空格,tab等) |
| public char charAt(int index) | 返回char指定索引处的值。 |
| public String[] split(String regex) | 将str字符串以"regex"为条件进行分割 |
| public String toLowerCase() | 将所有在此字符String使用默认语言环境的规则,以小写。 |
| public String toUpperCase() | 将所有在此字符String使用默认语言环境的规则,以大写。 |
字符常用API
| 方法 | 描述 |
|---|---|
| public static boolean isDigit(char ch) | 确定指定的字符是否是数字。 |
| public static boolean isLetter(char ch) | 确定指定的字符是否是一个字母。 |
| public static boolean isLetterOrDigit(char ch) | 确定指定的字符是字母还是数字。 |
| public static boolean isLowerCase(char ch) | 确定指定的字符是否是小写字符。 |
| public static boolean isUpperCase(char ch) | 确定指定的字符是否为大写字符。 |
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!