验证回文串
题目
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 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 字符组成
Related Topics
双指针
字符串
👍 643
👎 0
class Solution {
public boolean isPalindrome(String s) {
}
}
思路
- a-0:49, A-0:17,z-0:74, Z-0:42,0-0:0, 9-0:9
- 首节点start、尾节点end,判断是否相等
实现
class Solution {
public boolean isPalindrome(String s) {
if (s.length()<2)return true;
int start = 0;
int end = s.length()-1;
while (start<end){
int c1= covertToLow(s.charAt(start));
if (c1==-1){
start++;
continue;
}
int c2= covertToLow(s.charAt(end));
if (c2==-1){
end--;
continue;
}
if (c1!=c2){
return false;
}
start++;
end--;
}
return true;
}
private int covertToLow(char c){
int c1= c-'0';
if (c1>=49 && c1<=74){
return c;
}
else if (c1>=17&&c1<=42){
return c+32;
}
else if (c1>=0&&c1<=9){
return c1;
}
else {
return -1;
}
}
}
结果
解答成功:
执行耗时:1 ms,击败了100.00% 的Java用户
内存消耗:40.4 MB,击败了99.92% 的Java用户