欢迎来到我的小小世界

Change is a million times less painful than regret

0%

LC125.验证回文串

题目地址(125. 验证回文串)

https://leetcode-cn.com/problems/valid-palindrome/

题目描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

 

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:

输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
 

提示:

1 <= s.length <= 2 * 105
字符串 s 由 ASCII 字符组成

前置知识

  • 双指针,两端指针

公司

  • facebook,google

    思路

    常规思路非常简单,一共分两步:第一步,将除大写字母,小写字母和数字提取出来,添加到一个新的字符串中;第二步,设置两端指针,两个指针指向的位置进行比较,如果不相同直接返回false,相同则向内收缩,知道两端指针相同或者反向错位。

    关键点

  • 双指针,两端指针

代码

  • 语言支持:Java

Java
Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31


class Solution {
public boolean isPalindrome(String s) {
if(s.equals(" ")) return true;
String str="";
for(int i=0;i<s.length();i++){
if(s.charAt(i)>47&&s.charAt(i)<58)
str=str+s.charAt(i);
if(s.charAt(i)>64&&s.charAt(i)<91)
str=str+s.charAt(i);
if(s.charAt(i)>96&&s.charAt(i)<123)
str=str+s.charAt(i);
}
str=str.toLowerCase();
if(str.equals("")) return true;
System.out.print(str);
int left=0;
int right=str.length()-1;
while(left<=right){
if(str.charAt(left)!=str.charAt(right))
return false;
else {
left++;
right--;
}
}
return true;
}
}

补充

此题还有两种思路:
+去掉空格,标点等之后,直接将字符串反转,将反转后的字符串与原字符串进行对比,得出结果(整体思路与双指针的类似 )

  • 直接使用双指针向内收缩,遇到标点等非法字符直接跳过,仅比较合法的字符。

复杂度分析

令 n 为数组长度。

  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(n)$
-------- 本文结束 感谢阅读 --------