剑指offer018-有效的回文 题目 给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。
本题中,将空字符串定义为有效的 回文串 。
示例 1:
输入: s = "A man, a plan, a canal: Panama"
输出: true
解释: "amanaplanacanalpanama" 是回文串
示例 2:
输入: s = "race a car"
输出: false
解释:"raceacar" 不是回文串
提示:
1 <= s.length <= 2 * 105
字符串 s 由 ASCII 字符组成
注意:本题与主站 125 题相同: https://leetcode-cn.com/problems/valid-palindrome/
👍 9 👎 0
思路 一开始的想法肯定是先去掉非法的字符,全部转化为小写,判断该字符串左右相等
1 2 3 4 5 6 7 8 9 10 11 12 class Solution { public boolean isPalindrome (String s) { s = s.toLowerCase(); StringBuilder sb = new StringBuilder(); for (int i = 0 ; i < s.length(); i++) { if ((Character.isLetterOrDigit(s.charAt(i)))) { sb.append(s.charAt(i)); } } return sb.toString().equals(sb.reverse().toString()); } }
这里要注意数字和字符的判断
代码 1 2 3 4 5 6 7 8 9 10 11 12 class Solution { public boolean isPalindrome (String s) { s = s.toLowerCase(); StringBuilder sb = new StringBuilder(); for (int i = 0 ; i < s.length(); i++) { if ((Character.isLetterOrDigit(s.charAt(i)))) { sb.append(s.charAt(i)); } } return sb.toString().equals(sb.reverse().toString()); } }
1 2 3 解答成功: 执行耗时:5 ms,击败了17.77% 的Java用户 内存消耗:38 MB,击败了96.98% 的Java用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 class Solution { int offset = 'a' - 'A' ; public boolean isPalindrome (String s) { int n = s.length(); int left = n - 1 ; for (int i = 0 ; i < s.length(); i++) { if (!Character.isLetterOrDigit(s.charAt(i))) { continue ; } while (!Character.isLetterOrDigit(s.charAt(left)) && left > 0 ) { left--; } if (convert(s.charAt(i)) != convert(s.charAt(left))) { return false ; } left--; } return true ; } public char convert (char c) { if (c >= 'A' && c <= 'Z' ) { return (char ) (c + offset); } return c; } }
1 2 3 解答成功: 执行耗时:3 ms,击败了60.37% 的Java用户 内存消耗:38.5 MB,击败了45.08% 的Java用户