验证回文串
难度:
标签:
题目描述
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s
,如果它是 回文串 ,返回 true
;否则,返回 false
。
示例 1:
输入: s = "A man, a plan, a canal: Panama" 输出:true 解释:"amanaplanacanalpanama" 是回文串。
示例 2:
输入:s = "race a car" 输出:false 解释:"raceacar" 不是回文串。
示例 3:
输入:s = " " 输出:true 解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。 由于空字符串正着反着读都一样,所以是回文串。
提示:
1 <= s.length <= 2 * 105
s
仅由可打印的 ASCII 字符组成
代码结果
运行时间: 20 ms, 内存: 17.6 MB
/*
题目思路:
1. 使用Java Stream API处理字符串。
2. 移除所有非字母数字字符,将所有大写字母转换为小写字母。
3. 检查处理后的字符串是否是回文串。
*/
import java.util.stream.Collectors;
public class Solution {
public boolean isPalindrome(String s) {
// 使用流API过滤非字母数字字符并转换为小写
String filtered = s.chars()
.filter(Character::isLetterOrDigit)
.mapToObj(c -> String.valueOf((char) c).toLowerCase())
.collect(Collectors.joining());
// 反转字符串
String reversed = new StringBuilder(filtered).reverse().toString();
// 检查是否回文
return filtered.equals(reversed);
}
}
解释
方法:
此题解通过首先将输入字符串转换为小写,然后利用filter函数结合str.isalnum方法移除所有非字母数字字符,得到纯净的字符串s。随后,通过比较字符串的前半部分和后半部分(反向)的字符是否一致来判断字符串是否为回文。如果在比较过程中发现不匹配的字符,则立即返回false。如果所有对应位置的字符都相同,最终返回true。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在实现过程中,为什么选择先将字符串转化为小写再过滤非字母数字字符,这样的顺序是否有特别的考虑?
▷🦆
对于空字符串或只包含非字母数字字符的字符串,算法是如何处理的?
▷🦆
算法中使用双循环来比较字符是否相等,是否存在更高效的方法来减少比较次数或提高效率?
▷🦆
为什么算法中使用`filter`和`str.isalnum`函数而不是正则表达式进行字符过滤?
▷