字符串相关的结构和算法

字符串本质上是字符的数组,很多算法题与此相关。

a. 判断一个字符串是否是回文,忽略非ASCII值,忽略大小写。比如"A man, a plan, a canal: Panama"就是一个合法的回文字符串。

View Code
class Solution{
    bool isPalindrome(string s) {
        if (s.empty()) return true;
        int start = 0;
        int end = s.size() - 1;
        while (start < end){
            if (!isLetter(s[start]) && !isNumber(s[start])) {
                start++;
                continue;
            }
            if(!isLetter(s[end]) && !isNumber(s[end])) {
                end--;
                continue;
            }
            if (s[start] != s[end]) {
                if (isNumber(s[start]) || isNumber(s[end])) return false;
                int diff = s[start] - s[end]; 
                if (diff != 32 && diff != -32) return false;
            }
            start++;
            end--;
        }
        return true;
    }
}

回顾:判断是否回文子串,解法很简单,最重要的是搞清楚题目要求,哪些类型的char是被考虑的,哪些是被忽略的,然后两头指针向中间靠拢即可。

b. 一个int数组里面只有0,1,2三种数,求一次遍历的排序方法。(本质上是使用cursor,和大部分字符串处理的题类似,因此归位一类。)

View Code
class Solution {
    void sort(int[] A, int n) {
        if (n < 1) return;
        int i = 0, j = n-1, k = n-1;
        while (i <= j) {
            if (A[i] == 2) {
                swap(A[i], A[k]);
                k--;
                j = k < j ? k : j;
            }
            else if (A[i] == 1) {
                swap(A[i], A[j]);
                j--;
            }
            else 
                ++i
        }
    }
    void swap(int& a, int& b) {
         int tmp = a;
         a = b;
         b = tmp;
    }
};

回顾,这道题的经典之处在于需要保持两个后指针,一个前指针,想清楚的指针移动的规则就可以解决。

posted on 2013-02-04 14:29  梁霄  阅读(180)  评论(0)    收藏  举报

导航