如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
字母和数字都属于字母数字字符。
给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。
示例 2:
输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。
1、遍历
创建一个空字符(数组),把字母数字放进去,然后判断这个字符串是不是回文
时间:o(n)
空间:o(n)
python:
class Solution:
def isPalindrome(self, s: str) -> bool:
s1 = ""
for i in s:
if i.islower() or i.isupper():
i = i.upper()
s1 += i
if i.isdigit():
s1 += i
return s1 == s1[::-1]
java:
Character.isLetterOrDigit这个方法可以记一下
class Solution {
public boolean isPalindrome(String s) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (Character.isLetterOrDigit(s.charAt(i))) {
sb.append(Character.toLowerCase(s.charAt(i)));
}
}
// 一定要再新建一个sb
StringBuilder sb_rev = new StringBuilder(sb).reverse();
return sb_rev.toString().equals(sb.toString());
}
}
2、双指针
所谓双指针,相当于两处开始同时查找,可以直接在原字符串上判断,遇到非字母或者非数字直接跳过,前后指针遇到不同的字符直接返回false,遇到相同的字符同时向中间移动指针,如果指针相遇,则代表字符串是回文,最后返回true即可。
时间:o(n)、、、、、最坏为o(n)
空间:o(1)、、、、、原字符串判断,没有占用额外空间
python:
直接在原字符串判断,py字符串有个api判断字符串是否为字母或者数字isalnum
class Solution:
def isPalindrome(self, s: str) -> bool:
left = 0
right = len(s) - 1
while left <= right:
if not s[left].isalnum():
left+=1
elif not s[right].isalnum():
right-=1
elif s[left].lower() != s[right].lower():
return False
else:
left+=1
right-=1
return True
java:
java中遍历字符串出来是字符,Character.isLetterOrDigit判断字符是字母或者数字
Character.toLowerCase变为小写
class Solution {
public boolean isPalindrome(String s) {
int left = 0;
int right = s.length() - 1;
while (left <= right) {
char ch_l = s.charAt(left), ch_r = s.charAt(right);
if (!Character.isLetterOrDigit(ch_l)) {
left++;
}
else if (!Character.isLetterOrDigit(ch_r)) {
right--;
}
else if (Character.toLowerCase(ch_l) != Character.toLowerCase(ch_r)) {
return false;
}
else {
left++;
right--;
}
}
return true;
}
}