问题分析
你应该首先询问面试官,需要处理的字符串是一个ASCII字符串还是一个Unicode字符串。提出这个问题将展现你对细节的考虑和你坚实的计算机科学基础。为了简单起见,我们将假设字符串为ASCII类型。
一种解决方案是创建一个布尔值数组,其中位于索引i的标志指示字符i是否包含在字符串中。你第二次看到这个标识,你可以立即返回false。如果字符串长度超过了唯一字符的数量,我们也可以立即返回false。
算法
具体的算法实现如下:
public boolean isUniqueChars(String str) {
if (str.length() > 128) {
return false;
}
boolean[] charSet = new boolean[128];
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i);
if (charSet[val]) { // already found this char in string
return false;
}
charSet[val] = true;
}
return true;
}
这个代码的时间复杂度是O(n),其中n是字符串的长度。
我们可以通过使用位向量来将我们的空间使用减少八倍。我们将假设,在下面的代码中,该字符串只使用小写字母a到z。
/*
* We can reduce our space usage by a factor of eight by using a bit vector.
* We will assume,