题目

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

Note: For the purpose of this problem, we define empty string as valid palindrome.

Example 1:

  1. Input: "A man, a plan, a canal: Panama"
  2. Output: true

Example 2:

  1. Input: "race a car"
  2. Output: false

题意

忽略给定字符串中的非字母数字的字符,判断该字符串是否为回文串(忽略大小写)。

思路

Two pointers。


代码实现

Java

  1. class Solution {
  2. public boolean isPalindrome(String s) {
  3. if (s.isEmpty()) {
  4. return true;
  5. }
  6. int i = 0, j = s.length() - 1;
  7. while (i < j) {
  8. while (i < j && !isAlphanumeric(s.charAt(i))) {
  9. i++;
  10. }
  11. while (i < j && !isAlphanumeric(s.charAt(j))) {
  12. j--;
  13. }
  14. char cI = s.charAt(i), cJ = s.charAt(j);
  15. cI = cI >= 'a' && cI <= 'z' ? (char) (cI - 32) : cI;
  16. cJ = cJ >= 'a' && cI <= 'z' ? (char) (cJ - 32) : cJ;
  17. if (cI != cJ) {
  18. return false;
  19. }
  20. i++;
  21. j--;
  22. }
  23. return true;
  24. }
  25. private boolean isAlphanumeric(char c) {
  26. return c >= '0' && c <= '9' || c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z';
  27. }
  28. }

JavaScript

  1. /**
  2. * @param {string} s
  3. * @return {boolean}
  4. */
  5. var isPalindrome = function (s) {
  6. let left = 0, right = s.length - 1
  7. s= s.toLowerCase()
  8. while (left < right) {
  9. if (!/[a-z0-9]/.test(s[left])) {
  10. left++
  11. } else if (!/[a-z0-9]/.test(s[right])) {
  12. right--
  13. } else if (s[left++] !== s[right--]) {
  14. return false
  15. }
  16. }
  17. return true
  18. }