Leetcode: Valid Palindrome

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.



For example,

"A man, a plan, a canal: Panama" is a palindrome.

"race a car" is not a palindrome.



Note:

Have you consider that the string might be empty? This is a good question to ask during an interview.



For the purpose of this problem, we define empty string as valid palindrome.

难度:79. 这道题是判断一个字符串是不是回文串。因为只是看一个字符串,算法还是比较简单,就是从两头出发,往中间走,进行两两匹配。这里面的小问题就是在这个题目要求中,只判断字母和数字类型的字符,其他字符直接跳过即可。因此我们要写一个函数判断他是不是合法字符,而且因为忽略大小写,我们在判断两个字符是不是相同的时候如果是大写,要转成相应的小写字母。这个算法从两边扫描,到中间相遇,只需要一次线性扫描,复杂度是O(n),空间上是O(1)。

 1 public class Solution {

 2     public boolean isPalindrome(String s) {

 3         if (s == null || s.length() == 0) {

 4             return true;

 5         }

 6         int l = 0;

 7         int r = s.length() - 1;

 8         while (l < r) {

 9             while (l<s.length() && !isValidChar(s.charAt(l))) {

10                 l++;

11             }

12             while (r>0 && !isValidChar(s.charAt(r))) {

13                 r--;

14             }

15             if (l < r) {

16                 if (isSame(s.charAt(l), s.charAt(r))) {

17                     l++;

18                     r--;

19                 }

20                 else return false;

21             }

22         }

23         return true;

24     }

25     

26     public boolean isValidChar(char c) {

27         if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9'))

28             return true;

29         else return false;

30     }

31     

32     public boolean isSame(char s1, char s2) {

33         if (s1>='A' && s1<='Z') {

34             s1 = (char)(s1 - 'A' + 'a');

35         }

36         if (s2>='A' && s2<='Z') {

37             s2 = (char)(s2 - 'A' + 'a');

38         }

39         if (s1 == s2) {

40             return true;

41         }

42         else return false;

43     }

44 }

 34行和37行如果不强制转换类型,会出现possible loss of precision的错误

你可能感兴趣的:(LeetCode)