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


 

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;
    }
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM