题目
示例
解法一:
利用正则表达式判断每个字符是否为字母或者数字,然后利用stringbuild进行拼接字母或者数字;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
//时字母和数字就拼接到string builder
if (Character.isLetterOrDigit(s.charAt(i))) {
sb.append(s.charAt(i));
}
}
然后转换为字符串,建立双指针,一个指向末尾,一个指向开头,从两边向中间进行比较,如果不相等,就返回false,否则最后返回true;
s = sb.toString();
int i = 0;
int index = s.length() - 1;
//进行判断
while (i < index) {
if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(index))) {
return false;
}
i++;
index--;
}
return true;
当然也可以直接使用string builder的reverse方法反转,然后进行比较
完整代码:
public static boolean isPalindrome1(String s) {
// if (s.length()==1){
// return true;
// }
//用string builder来将起来非字母和数字全部去掉
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
//时字母和数字就拼接到string builder
if (Character.isLetterOrDigit(s.charAt(i))) {
sb.append(s.charAt(i));
}
}
s = sb.toString();
int i = 0;
int index = s.length() - 1;
//进行判断
while (i < index) {
if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(index))) {
return false;
}
i++;
index--;
}
return true;
}
解法二
直接建立双指针,left和right,从两边遇到符合条件的字符在停下比较,否则移动寻找,当left大于右指针的时候,退出。进行比较。
完整代码:
public static boolean isPalindrome2(String s) {
int i = 0;
int index = s.length() - 1;
//两个指针相遇就退出
while (i < index) {
//从左往右找到数组或者字母,这里判断是否相遇的原因是,有可能一直没有找到可能发生越界
while (i < index && !Character.isLetterOrDigit(s.charAt(i))) {
i++;
}
//同理从右往左找
while (i < index && !Character.isLetterOrDigit(s.charAt(index))) {
index--;
}
//进行比较,如果不相等,返回false
if (Character.toLowerCase(s.charAt(i)) != Character.toLowerCase(s.charAt(index))) {
return false;
}
i++;
index--;
}
return true;
}
解法三—替换掉所有不符合条件的字符
利用字符串方法replaceAll将所有部分和条件的字符替换为""。然后在建立双指针对从两头开始进行比较。
public static boolean isPalindrome5(String s) {
//将不符合条件的字符进行替换
s = s.replaceAll("[^0-9a-zA-Z]", "").toLowerCase();
//遍历比较
int left = 0;
int right = s.length() - 1;
char[] chs = s.toCharArray();
while (left < right) {
if (chs[left] != chs[right]) {
return false;
}
left++;
right--;
}
return true;
}