題目描述:有一個字符串,判斷這個字符串的各個字符是不是惟一的數組
解法1:假設這個字符串的編碼爲ascii,因此設置一個長度爲256的bool數組,數組下標設爲字符的ascii碼,數組的值初始化爲0。對字符串的字符循環判斷,若是ascii碼對應的value爲1,則不惟一,value爲0繼續循環直到終止,代碼以下:編碼
bool unique(string s) { if (s.length() > 256) return false; bool flag[256]; memset(flag, 0, 256*sizeof(bool)); for (int i=0; i<s.length(); i++) { int val = int(s[i]); if (flag[val]) return false; flag[val] = true; } return true; }
該方法的空間複雜度與輸入字符串的長度無關,因此爲O(1),時間複雜度爲O(n)。spa
以上的方法空間存儲要256個字節,其實咱們能夠觀察到,它用一個字節來表示true或是false,浪費了其它7個bit,因此咱們能夠改進成用一個bit來表示true或是false,用到的空間存儲爲32個字節。想法是用每一位表明一個字符,代碼以下:code
bool unique_2(string s) { if (s.length() > 256) return false; int flag[8]; memset(flag, 0, sizeof(int)*8); for (int i=0; i<s.length(); i++) { int val = int(s[i]); int index = val / 32; //找到下標 int bit = val % 32; //找到bit if (flag[index] & (1 << bit)) return false; flag[index] |= (1 << bit); } return true; }