125. 验证回文串

image.png

将非ASCII字符去掉,再反转对比

执行用时:4 ms, 在所有 Java 提交中击败了64.90%的用户 内存消耗:38.6 MB, 在所有 Java 提交中击败了51.04%的用户

  1. class Solution {
  2. public boolean isPalindrome(String s) {
  3. StringBuilder stringBuilder = new StringBuilder();
  4. for (char c :s.toCharArray()){
  5. if (Character.isLetterOrDigit(c)) {
  6. stringBuilder.append(Character.toLowerCase(c));
  7. }
  8. }
  9. String originalStr = stringBuilder.toString();
  10. String reverseStr = stringBuilder.reverse().toString();
  11. return originalStr.equals(reverseStr);
  12. }
  13. }

将非ASCII字符去掉,再用双指针对比

执行用时:5 ms, 在所有 Java 提交中击败了46.01%的用户 内存消耗:38.5 MB, 在所有 Java 提交中击败了57.19%的用户

  1. class Solution {
  2. public boolean isPalindrome(String s) {
  3. StringBuilder stringBuilder = new StringBuilder();
  4. for (char c :s.toCharArray()){
  5. if (Character.isLetterOrDigit(c)) {
  6. stringBuilder.append(Character.toLowerCase(c));
  7. }
  8. }
  9. for (int i = 0; i < stringBuilder.length() / 2; i++) {
  10. if (stringBuilder.charAt(i) != stringBuilder.charAt(stringBuilder.length() - i - 1)) {
  11. return false;
  12. }
  13. }
  14. return true;
  15. }
  16. }

直接在原字符串操作

执行用时:3 ms, 在所有 Java 提交中击败了93.23%的用户 内存消耗:38.5 MB, 在所有 Java 提交中击败了70.80%的用户

  1. class Solution {
  2. public boolean isPalindrome(String s) {
  3. int left = 0;
  4. int right = s.length() - 1;
  5. while (left < right) {
  6. while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
  7. left ++;
  8. }
  9. while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
  10. right --;
  11. }
  12. if (left < right) {
  13. if (Character.toLowerCase(s.charAt(left ++)) != Character.toLowerCase(s.charAt(right --))) {
  14. return false;
  15. }
  16. }
  17. }
  18. return true;
  19. }
  20. }