> For the complete documentation index, see [llms.txt](https://liuyang89116.gitbook.io/my-leetcode-book/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://liuyang89116.gitbook.io/my-leetcode-book/chapter_2_string/problem_125_valid_palindrome.md).

# Problem 125: Valid Palindrome

> <https://leetcode.com/problems/valid-palindrome/>

题目不难，但是要注意的东西还是有很多的

## 思路

这道题的思路就是首尾各一个指针，遇到不是字母或者数字的字符跳过，最后汇合，判定是否为palindrome

```java
public class Solution {
    public boolean isPalindrome(String s) {
        int start = 0;
        int end = s.length() - 1;
        char c1, c2;
        while (start <= end) {
            c1 = s.charAt(start);
            c2 = s.charAt(end);
            if (!Character.isLetterOrDigit(c1)) {
                start++;
            } else if (!Character.isLetterOrDigit(c2)) {
                end--;
            } else {
                if (Character.toLowerCase(c1) != Character.toLowerCase(c2)) {
                    return false;
                }
                start++;
                end--;
            }
        }
        return true;
    }
}
```

## 易错点

1. 逻辑结构一定要想清楚：几个条件要同时满足（start得是字母，end也得是字母），缺一不可，那么得用 if...else...这个结构
2. start 和 end 变化的位置&#x20;

   ```java
   start++;
   end--;
   ```

   应该放在else的block下面，因为是在他们都是字母的情况下进行的操作
3. 判断是否为字母

   ```java
   Character.isLetterOrDigit(c1);
   ```
4. 转换大小写

   ```java
   Character.toLowerCase(c1);
   ```
