题目描述
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
第一次解题
class Solution {
public boolean isPalindrome(String s) {
char[] temp = s.toLowerCase().toCharArray(); //小写化 再分出去
List<Character> ch = new ArrayList<>();
for(int i =0;i<temp.length;i++){
int c = temp[i];
if(( c> 96 && c <123)||(c > 47 && c <58)){
ch.add(temp[i]);
}
}
for(int i =0,j=ch.size()-1;i<=j;i++,j--){
if(ch.get(i) != ch.get(j)){
return false;
}
}
return true;
}
}
题解
一、api
class Solution {
public boolean isPalindrome(String s) {
StringBuffer sgood = new StringBuffer();
int length = s.length();
for (int i = 0; i < length; i++) {
char ch = s.charAt(i);
if (Character.isLetterOrDigit(ch)) {
sgood.append(Character.toLowerCase(ch));
}
}
StringBuffer sgood_rev = new StringBuffer(sgood).reverse();
return sgood.toString().equals(sgood_rev.toString());
}
}
二、api+双指针
class Solution {
public boolean isPalindrome(String s) {
int n = s.length();
int left = 0, right = n - 1;
while (left < right) {
while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
++left;
}
while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
--right;
}
if (left < right) {
if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {
return false;
}
++left;
--right;
}
}
return true;
}
}
总结-StringBuffer、大小写
StringBuffer
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
append(String s)
StringBuffer(str).reverse()
元素逆序
delete(int start, int end)
insert(int offset, int i)
replace(int start, int end, String str)
Character.isLetterOrDigit(ch)
确定指定字符ch是一个字母或数字,是的话则返回true。
Character.toLowerCase(ch)
将字符串转换为小写