题意:

解题思路:

  1. 思路:
  2. (线性扫描) O(n)
  3. 1. 用两个指针分别从前后开始,往中间扫描。
  4. 2. 每次迭代两个指针分别向中间靠近一步,靠近的过程中忽略除了字母和数字的其他字符。
  5. 3. 然后判断两个指针所指的字符是否相等,如果不相等,说明不是回文串。
  6. 4.当两个指针相遇时,说明原字符串是回文串。
  7. 时间复杂度分析:每个字符仅会被扫描一次,所以时间复杂度是 O(n)。

PHP代码实现:

  1. class Solution {
  2. function isAlphanumeric($s) {
  3. return ($s >= 'a' && $s <= 'z') || ($s >= 'A' && $s <= 'Z')
  4. || ($s >= '0' && $s <= '9');
  5. }
  6. function isEqualIgnoreCase($a, $b) {
  7. if ($a >= 'A' && $a <= 'Z') $a = strtolower($a);
  8. if ($b >= 'A' && $b <= 'Z') $b = strtolower($b);
  9. return $a == $b;
  10. }
  11. function isPalindrome1($s) {
  12. if ($s == null || strlen($s) == 0) return true;
  13. $i = 0; $j = strlen($s) - 1;
  14. for (; $i < $j; ++$i, --$j) {
  15. //不是字母或者数字,i < j:防止移动到j后面
  16. while ($i < $j && !$this->isAlphanumeric($s[$i])) ++$i;
  17. while ($i < $j && !$this->isAlphanumeric($s[$j])) --$j;
  18. if ($i < $j && strtolower($s[$i]) != strtolower($s[$j])) return false;
  19. }
  20. return true;
  21. }
  22. /**
  23. * @param String $s
  24. * @return Boolean
  25. */
  26. function isPalindrome($s) {
  27. return $this->isPalindrome1($s);
  28. if (empty($s)) return true;
  29. $str = $rStr = '';
  30. $count = strlen($s);
  31. $l = 0;
  32. $r = $count - 1;
  33. while ($l < $r) {
  34. $lLetter = $this->isLetter($s[$l]);
  35. $rLetter = $this->isLetter($s[$r]);
  36. if ($lLetter === false) {
  37. $l++;
  38. continue;
  39. }
  40. if ($rLetter === false) {
  41. $r--;
  42. continue;
  43. }
  44. if ($lLetter != $rLetter) {
  45. return false;
  46. }
  47. $l++;$r--;
  48. }
  49. return true;
  50. }
  51. function isLetter($str) {
  52. if ($str >= 'a' && $str <= 'z') {
  53. return $str;
  54. } else if ($str >= 'A' && $str <= 'Z') {
  55. return chr(ord($str) + 32);
  56. } else if (in_array($str,['0','1','2','3','4','5','6','7','8','9'])) {
  57. return $str;
  58. }
  59. return false;
  60. }
  61. }

GO代码实现:

  1. func isPalindrome(s string) bool {
  2. if s == "" {
  3. return true
  4. }
  5. s = strings.ToLower(s)
  6. n := len(s)
  7. i, j := 0, n-1
  8. for i < j {
  9. if !isValidChar(s[i]) {
  10. i++
  11. continue
  12. }
  13. if !isValidChar(s[j]) {
  14. j--
  15. continue
  16. }
  17. if s[i] != s[j] {
  18. return false
  19. }
  20. i++
  21. j--
  22. }
  23. return true
  24. }
  25. func isValidChar(char byte) bool {
  26. return (char >= 'A' && char <= 'Z') ||
  27. (char >= 'a' && char <= 'z') ||
  28. (char >= '0' && char <= '9')
  29. }