Leetcode 125 Valid Palindrome
Posted hwd9654
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode 125 Valid Palindrome相关的知识,希望对你有一定的参考价值。
lc125 Valid Palindrome
法一:
双指针
首尾指针向中间收缩,比较两者指向元素是否相同
不相同就返回false
若遇到非数字非字母的字符,跳过,这里可以手写if判断,也可以用Character内置函数Character.isLetterOrDigit()
还有一点需要注意,同一个字母的小写形式和大写形式应当被判定为相同,但是==比较时,两者的ascii值不同,可以手写if判断,也可以用Character.toLowerCase(),统一成小写或大写形式,
注意while终止条件 i<j即可
奇数个字母时,两个指针最终会相同,但是我们不需要比较他们,因为这对回文串没有任何影响;
偶数个字母时,两个指针刚好差1,i<j可以覆盖这种情况
1 class Solution 2 public boolean isPalindrome(String s) 3 for(int left = 0, right = s.length()-1; left < right;) 4 if(!Character.isLetterOrDigit(s.charAt(left))) 5 left++; 6 else if(!Character.isLetterOrDigit(s.charAt(right))) 7 right--; 8 else 9 if(Character.toLowerCase(s.charAt(left++)) != Character.toLowerCase(s.charAt(right--))) 10 return false; 11 12 13 return true; 14 15
法二:
将数字和字母从ascii值映射到1-10,11~36(大小写映射到同一个值所以只有26而非52),其它字符统统算为0
这样可以大大缩短调用isLetterOrDigit和toLowerCase的时间
1 class Solution 2 public static final int[] charmap = new int[128]; 3 static 4 for(int i=0; i<10; i++) 5 charmap[i + ‘0‘] = i+1; 6 for(int i=0; i<26; i++) 7 charmap[i + ‘a‘] = charmap[i + ‘A‘] = i+11; 8 9 public boolean isPalindrome(String s) 10 for(int left = 0, right = s.length() - 1; left < right; ) 11 if(charmap[s.charAt(left)] == 0) 12 left++; 13 else if(charmap[s.charAt(right)] == 0) 14 right--; 15 else 16 if(charmap[s.charAt(left++)] != charmap[s.charAt(right--)]) 17 return false; 18 19 20 return true; 21 22
以上是关于Leetcode 125 Valid Palindrome的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 125. Valid Palindrome
Leetcode 125. Valid Palindrome