Fork me on GitHub

LeetCode-125:验证回文字符串

本题为LeetCode中第125道题,也比较简单

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

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

示例 1:

1
2
输入: "A man, a plan, a canal: Panama"
输出: true

示例 2:

1
2
输入: "race a car"
输出: false

博主代码:

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
32
33
34
35
36
/**
* @author RickYinPeng
* @ClassName 验证回文串
* @Description LeetCode中第125道题
* @date 2018/10/31/18:24
*/
public class 验证回文串 {
public static void main(String[] args) {
String s = "A man, a plan, a canal: Panama";
boolean palindrome = isPalindrome(s);
System.out.println(palindrome);
}

public static boolean isPalindrome(String s) {
//去除空格
s = s.replaceAll(" ","");
//去除其它字符
s = s.replaceAll("[^\\da-zA-Z]","");

//System.out.println("s:"+s);

StringBuilder stringBuilder = new StringBuilder(s);
//System.out.println("stringBuilder:"+stringBuilder);

StringBuilder reverse = stringBuilder.reverse();
//System.out.println("reverse:"+reverse);

String toString = reverse.toString();
//System.out.println("toString:"+toString);

if(s.equalsIgnoreCase(toString)){
return true;
}
return false;
}
}

大佬代码:

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
public boolean isPalindrome_2(String s) {
if(s==null||s.length()==0) {
return true;
}
char[] numbers=s.toCharArray(); //转换为字符数组

//大写字母转换为小写
for(int i=0;i<numbers.length;i++) {
if(numbers[i]>='A'&&numbers[i]<='Z') {
numbers[i]+=32;
}
}
for(int start=0,end=numbers.length-1;start<end;) {
if(numbers[start]!=numbers[end]) {
//首先判断是否为其它字符
if((numbers[start]<'a'||numbers[start]>'z')&&(numbers[start]<'0'||numbers[start]>'9')) { //开头不是字母和数字
++start;
}else if((numbers[end]<'a'||numbers[end]>'z')&&(numbers[end]<'0'||numbers[end]>'9')) { //结尾不是字母和数字
--end;
}else {
return false;
}
}else {
++start;
--end;
}
}
return true;
}

就是不一样啊,虽然人家的代码比我长,但是它的执行效率比我快了一倍,看来用Java做算法还是得抛开许多人家集成的工具啊

其实String也可以使用这种两个指针前后跑的办法,开来要边学边回头看啊,所谓温故而知新