对于asccii字符集,您可以用4个long表示256位:您基本上是手工编码一个数组。
public static boolean isUniqueChars(String str) { long checker1 = 0; long checker2 = 0; long checker3 = 0; long checker4 = 0; for (int i = 0; i < str.length(); ++i) { int val = str.charAt(i); int toCheck = val / 64; val %= 64; switch (toCheck) { case 0: if ((checker1 & (1L << val)) > 0) { return false; } checker1 |= (1L << val); break; case 1: if ((checker2 & (1L << val)) > 0) { return false; } checker2 |= (1L << val); break; case 2: if ((checker3 & (1L << val)) > 0) { return false; } checker3 |= (1L << val); break; case 3: if ((checker4 & (1L << val)) > 0) { return false; } checker4 |= (1L << val); break; } } return true;}您可以使用以下代码为Unipre字符生成类似方法的主体:
static void generate() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1024; i++) { sb.append(String.format("long checker%d = 0;%n", i)); } sb.append("for (int i = 0; i < str.length(); ++i) {n" + "int val = str.charAt(i);n" + "int toCheck = val / 64;n" + "val %= 64;n" + "switch (toCheck) {n"); for (int i = 0; i < 1024; i++) { sb.append(String.format("case %d:n" + "if ((checker%d & (1L << val)) > 0) {n" + "return false;n" + "}n" + "checker%d |= (1L << val);n" + "break;n", i, i, i)); } sb.append("}n" + "}n" + "return true;"); System.out.println(sb);}


