[CareerCup] 1.1 Unique Characters of a String 字串中不同的字元

Grandyang發表於2015-07-15

 

1.1 Implement an algorithm to determine if a string has all unique characters. What if you cannot use additional data structure?

 

這道題讓我們判斷一個字串中是否有重複的字元,要求不用特殊的資料結構,這裡應該是指雜湊表之類的不讓用。像普通的整型陣列應該還是能用的,這道題的小技巧就是用整型陣列來代替雜湊表,在之前Bitwise AND of Numbers Range 數字範圍位相與的解法二中也用到過這種方法。由於ASCII表裡的基本表共有128個字元,也就是可以用鍵盤表示出來的,整個表共有256個字元,所以我們只要用一個大小為256的整型陣列就可以包含所有的字元,我們遍歷輸入字串,對每一個字元都存入到相應位置,並賦值1,如果遇到已經為1的,說明之前出現過該字元,返回false,如果遍歷完s,則返回true,程式碼如下:

 

class Solution {
public:
    bool isUniqueChar(string s) {
        if (s.size() > 128) return false;
        int m[256] = {0};
        for (int i = 0; i < s.size(); ++i) {
            if (m[s[i]] > 0) return false;
            m[s[i]] = 1;
        }
        return true;
    }
};

 

書上還給了另一種解法,是用位操作 Bit Manipulation,但是這種解法只有當輸入字串是由小寫字母組成的才成立,因為小寫字母只有26個,不超過整型int的32位,對於每個字母,我們將對應位置設為1,然後看之前是否是1,是的話返回false,不是的話設為1。跟上面的方法核心是一樣的,只不過空間上省了很多,但是也對輸入做了更為嚴格的限制,程式碼如下:

 

// Only works when s consists of lower-case letters a-z
class Solution {
public:
    bool isUniqueChar(string s) {
        int m = 0;
        for (int i = 0; i < s.size(); ++i) {
            int d = s[i] - 'a';
            if (m & (1 << d) > 0) return false;
            m |= (1 << d);
        }
        return true;
    }
};

 

相關文章