解法都在代码里,不懂就留言或者私信
class Solution {
/**这题目感觉不是算法题,应该是考coding的细节点,比如如何判断两个字符是否equals(大小写要equals)
空格要忽略,感觉就是纯coding,难道是为了考察细心?不说了,开始解题 */
public boolean isPalindrome(String s) {
/**题目规定至少有一个字符,所以我们这里扣一下长度为1的情况 */
if(s.length() == 1) {
/**就一个长度,管他是啥,都是回文*/
return true;
}
/**这里也可以接着写.length==2判断是否相等,我就不写了,没必要*/
/**我的习惯先转成字符数组然后用下标,你不想转就用charAt */
char[] sArr = s.toCharArray();
/**定义左右指针,使用双指针求解 */
int left = 0;
int right = sArr.length - 1;
while(left <= right) {
/**左边所有不是大小写字母和数字的都忽略*/
while(left <= right && !(isChar(sArr[left]) || isNumber(sArr[left]))) {
left ++;
}
/**右边所有不是大小写字母和数字的都忽略 */
while(left <= right && !(isChar(sArr[right]) || isNumber(sArr[right]))) {
right --;
}
/**可能前面++和--之后已经越界了,判断以下,这里也可以写成left和right都是大于等于0小于sArr.length */
if(left > right) return true;
/**不相等直接返回false结束 */
if(!equals(sArr[left], sArr[right])) {
return false;
}
/**相等左右指针各移动一步 */
left ++;
right --;
}
/**中间没有返回false,就验证成功了 */
return true;
}
public boolean equals(char c1, char c2) {
/**如果都是数字就判断== */
if(isNumber(c1) && isNumber(c2)) {
return c1 == c2;
}
/**如果一个为数字,另外一个为字母肯定是不相等的*/
if(isNumber(c1) || isNumber(c2)) {
return false;
}
/**剩下的就是两个字母的比较 */
return c1 == c2 || Math.abs(c1 - c2) == 32;
}
/**判断是不是数字 */
public boolean isNumber(char c) {
return c >= '0' && c <= '9';
}
/**判断是不是大小写字母 */
public boolean isChar(char c) {
return c >= 'a' && c <='z' || (c >='A' && c <='Z');
}
}
运行结果,不太满意