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