题目描述(简单难度)

判断一个字符串是否是回文串,忽略掉除了字母和数字外的字符。

解法一

两个指针,一个指针从头进行,一个指针从尾部进行。依次判断两个指针的字符是否相等,同时要跳过非法字符。需要注意的是,两个指针不用从头到尾遍历,当两个指针相遇的时候就意味着这个字符串是回文串了。

还需要注意的是 ,也就是大写字母和小写字母是相同的。

解法二

上边为了处理大小写字母的问题,首先全部统一为了小写。为了找出非法字符,每次都需要判断一下该字符是否在合法范围内。

这里用一个技巧,把 '0''9' 映射到 110'a''z' 映射到 1136'A''Z' 也映射到 1136 。然后把所有数字和字母用一个 char 数组存起来,没存的字符就默认映射到 0 了。

这样只需要判断字符串中每个字母映射过去的数字是否相等,如果是 0 就意味着它是非法字符。

  1. private static final char[] charMap = new char[256];
  2. static {
  3. // 映射 '0' 到 '9'
  4. for (int i = 0; i < 10; i++) {
  5. charMap[i + '0'] = (char) (1 + i); // numeric
  6. }
  7. // 映射 'a' 到 'z' 和 映射 'A' 到 'Z'
  8. for (int i = 0; i < 26; i++) {
  9. }
  10. }
  11. public boolean isPalindrome(String s) {
  12. char[] pChars = s.toCharArray();
  13. int start = 0, end = pChars.length - 1;
  14. char cS, cE;
  15. while (start < end) {
  16. cS = charMap[pChars[start]];
  17. cE = charMap[pChars[end]];
  18. if (cS != 0 && cE != 0) {
  19. return false;
  20. start++;
  21. end--;
  22. } else {
  23. if (cS == 0)
  24. start++;
  25. if (cE == 0)
  26. end--;
  27. }
  28. }
  29. return true;
  30. }

添加好友一起进步~

如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^