解法都在代码里,不懂就留言或者私信
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');}
}
运行结果,不太满意