原文:Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?html
譯文:實現一個算法來判斷一個字符串中的字符是否惟一(即沒有重複).不能使用額外的數據結構。 (即只使用基本的數據結構)算法
解答:首先須要肯定構成字符串的字符集有多大,是ASCII仍是26個英文字母,對於不一樣的字符集有不一樣的解法。數組
以字符集是ASCII爲例,咱們能夠使用一個256大小的boolean數組,數組初始化爲false,遍歷一遍字符串中的字符,當bool數組對應位置的值爲真, 代表該字符在以前已經出現過,便可得出該字符串中有重複字符。不然將該位置的bool數組 值置爲true。數據結構
package test;public class Test { public static void main(String args[]){ System.out.println(isRepeat("abcd")); } public static boolean isRepeat(String s){ /** * 該數組默認是false */
boolean[] bool = new boolean[256]; /** * 遍歷一遍字符串字節 * 當bool數組對應位置的值爲真, 代表該字符在以前已經出現過, * 便可得出該字符串中有重複字符, * 不然將該位置的bool數組值置爲true。 */
for(byte a:s.getBytes()){ if(bool[a]) return true; else bool[a] = true; } return false; } }
這是一種解題思路,還能夠經過位向量來減小空間的使用量。對於ASCII字符,咱們須要256位,一個int型的數有4個字節,也就是32位,即一個長度爲8的int 數組a便可。這裏的關鍵是要把字符對應的數字,映射到正確的位上去。a[0]表示第1~32個數(0~31),a[1]表示第33~64個數(32~63)······post
package test; public class Test { public static void main(String args[]){ System.out.println(isRepeat("abcdsa")); } public static boolean isRepeat(String s){ /** * 該數組默認是false */
int[] ints = new int[8]; final int CONSTANT = 32; for(byte a:s.getBytes()){ //商,判斷在哪一個數組
int ids = a / CONSTANT; //餘數,判斷在數組的第幾位
int shift = a % CONSTANT; /** * 當前位是1,則返回true,說明重複 * 當前位是0,則置爲1。 */
if((ints[ids] & 1<< shift) > 0) return true; else ints[ids] = ints[ids] | 1<< shift; } return false; } }
關於位向量的幾篇文章:url