Leetcode
题目要求
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写
说明:本题中,我们将空字符串定义为有效的回文串;
- 示例1.
- 输入: “A man,a plan,a canal:Panama”
- 输出:true
- 示例2.
- 输入:“race a car”
- 输出:false
核心思想
1.先将字符串变为小写,因为本题忽略了字母的大小写。
2.利用字符的ASCII值进行验证
3.采用双指针的办法,一个指向头,一个指向尾,同时向中间靠拢,过程中两指针指向目标不相等则退出返回false,直到两个指针汇合,则验证成功,即是回文串。
解法一(未优化)
/**
*
* 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写
* 说明:本题中,我们将空字符串定义为有效的回文串;
* 示例1.
* 输入: "A man,a plan,a canal:Panama"
* 输出:true
* 示例2.
* 输入:"race a car"
* 输出:false
*
* @author mac
*
*/
public class Solution {
public boolean isPalindrome(String s) {
//先将s变为小写
s = s.toLowerCase();
char[] strArray = s.toCharArray();
System.out.println(strArray);
int i = 0;
int j = strArray.length - 1;
//利用ASCII码值进行验证
while(i < j) {
//48~57是数字,97~122是小写英文,65~90是大写英文
while((int)strArray[i] < 48 || ((int)strArray[i] > 57 &&(int)strArray[i] < 97) || (int)strArray[i] > 122) {
i++;
}
while((int)strArray[j] < 48 || ((int)strArray[j] > 57 &&(int)strArray[j] < 97) || (int)strArray[j] > 122) {
j--;
}
if(strArray[i] != strArray[j]){
return false;
}else {
i++;
j--;
}
}
return true;
}
public static void main(String[] args) {
Solution sl = new Solution();
String str = "A man,a plan,a canal:Panama";
String str2 = "race a car";
System.out.println(sl.isPalindrome(str));
System.out.println(sl.isPalindrome(str2));
}
}
这里会有一个问题,如果字符串是空的,或者超级长,就会产生错误,所以我们可以进行优化
解法二
class Solution {
public boolean isPalindrome(String s) {
//转为小写
s = s.toLowerCase();
int start = 0;
int end = s.length() - 1;
while (start < end && start < s.length() - 1) {
char bgChar = s.charAt(start);
char edChar = s.charAt(end);
//在这里判断用了两种方式 1.while 2.if 作用是一样的
while (!((bgChar >= 'a' && bgChar <= 'z') || (bgChar >= '0' && bgChar <= '9')) && start < s.length() - 1) {
start++;
bgChar = s.charAt(start);
}
if (!((edChar >= 'a' && edChar <= 'z') || (edChar >= '0' && edChar <= '9'))) {
end--;
continue;
}
if (bgChar != edChar) {
return false;
}
start++;
end--;
}
return true;
}
public static void main(String[] args) {
Solution sl = new Solution();
String str = "A man,a plan,a canal:Panama";
String str2 = "race a car";
String str3 = "0P";
String str4 = ",.";
System.out.println(sl.isPalindrome(str));
System.out.println(sl.isPalindrome(str2));
System.out.println(sl.isPalindrome(str3));
System.out.println(sl.isPalindrome(str4));
}
}
注意这里的判断不能用while。