【求知=>算法】验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
**说明:**本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
解释:”amanaplanacanalpanama” 是回文串
示例 2:
输入: “race a car”
输出: false
解释:”raceacar” 不是回文串
提示:
1 <= s.length <= 2 * 105字符串 s 由 ASCII 字符组成
解题思路
- 循环数据的方式
- 定义字符串s,并赋值为
s = “A man, a plan, a canal: Panama”; - s字符转成小写字母,循环字符串去除空格和逗号以及多余字符组合成新的字符res;
- 循环字符串s,依次判断当前字符串的下标和总长度减去当前字符串的下标然后减去一的长度做对比,如果相等就是回文串,不想等就不是回文串。
s = "A man, a plan, a canal: Panama"
# s = "race a car"
new = s.lower()
res = ''.join([x for x in new if x.isalpha() or x.isdigit()])
for i in range(len(res)):
if res[i] != res[len(res) - i -1]:
return False
return True
- 字符串切片的方式
- 定义字符串s,并赋值为
s = “A man, a plan, a canal: Panama”; - s字符转成小写字母,循环字符串去除空格和逗号以及多余字符组合成新的字符res;
- 判断正序的字符串和倒序的字符串是否相等,如果相等就是回文串,反之就不是。
# s = "A man, a plan, a canal: Panama"
s = "race a car"
new_s = s.lower()
res = ''.join([x for x in new_s if x.isalpha() or x.isdigit()])
if len(res) == 0:
return False
if res == res[::-1]:
return True
else:
return False
- 双指针思路
- 定义字符串s,并赋值为
s = “A man, a plan, a canal: Panama”; - s字符转成小写字母,循环字符串去除空格和逗号以及多余字符组合成新的字符res;
- 定义开始和结束的指针start和end,并赋值
start = 0,end = len(res) - 1; - 循环结束的指针大于等于开始指针的数据,如果开始指针的数据不等于结束指针的数据就是回文串,反之就不是。
# s = "A man, a plan, a canal: Panama"
s = "race a car"
new_s = s.lower()
res = ''.join([x for x in new_s if x.isalpha() or x.isdigit()])
start = 0
end = len(res) - 1
while start <= end:
if res[start] != res[end]:
return False
start +=1
end -=1
return True
- reversed函数的方式
- 定义字符串s,并赋值为
s = “A man, a plan, a canal: Panama”; - s字符转成小写字母,循环字符串去除空格和逗号以及多余字符组合成新的字符res;
- 判断正序的字符串和通过reversed函数反转的字符串是否相等,如果相等就是回文串,反之就不是。
# s = "A man, a plan, a canal: Panama"
s = "race a car"
new_s = s.lower()
res = ''.join([x for x in new_s if x.isalpha() or x.isdigit()])
res_s = ''.join(reversed(res))
if len(res) == 0:
return False
if res == res_s:
return True
else:
return False