判断是否是回文字符串(leetcode 125)

一:解题思路

Time:O(n),Space:O(1)

二:完整代码示例 (C、C++、Java、Python)
方法一C:

bool isNumberOrCharacter(char c) {
    return (c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='0' && c<='9');
}

bool isEqualIgnoreCase(char a, char b) {
    if (a >= 'A' && a <= 'Z') a += 32;
    if (b >= 'A' && b <= 'Z') b += 32;

    return (a==b);
}

bool isPalindrome(char * s) {
    if (s == NULL) return true;

    int i = 0;
    int j = strlen(s) - 1;
    while (i < j) {
        for (;i < j; i++, j--) {
            while (i < j && !isNumberOrCharacter(s[i])) i++;
            while (i < j && !isNumberOrCharacter(s[j])) j--;
            if (i<j && !isEqualIgnoreCase(s[i], s[j])) return false;
        }
    }

    return true;
}

方法一C++:

class Solution {
private:
    bool isNumberOrCharacter(char c) {
        return (c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9');
    }

    bool isEqualIngoreCase(char a, char b) {
        if (a >= 'A' && a <= 'Z') a += 32;
        if (b >= 'A' && b <= 'Z') b += 32;
        return (a==b);
    }
public:
    bool isPalindrome(string s) {
        if (s.length() == 0) return true;

        int i = 0;
        int j = s.length() - 1;
        while (i < j) {
            for (; i < j; i++, j--) {
                while (i < j && !isNumberOrCharacter(s[i])) i++;
                while (i < j && !isNumberOrCharacter(s[j])) j--;
                if (i<j && !isEqualIngoreCase(s[i], s[j])) return false;
            }
        }

        return true;
    }
};

方法一Java:

 

方法一Python:

class Solution:
    def isPalindrome(self, s: str) -> bool:
        if not s: return True
        n=len(s)
        i,j=0,n-1
        
        while i<j:
            while i<j and not s[i].isalnum():
                i=i+1
            while i<j and not s[j].isalnum():
                j=j-1
            if i<j:
                if s[i].lower()!=s[j].lower():
                    return False
                i,j=i+1,j-1
        return True

 

posted @ 2020-03-05 12:17  repinkply  阅读(192)  评论(0)    收藏  举报