问题分析
你应该首先询问面试官,需要处理的字符串是一个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, in the below code, that the string only uses the
* lowercase letters a through z. This will allow us to use j

该博客讨论了如何在Java面试中解决判断字符串中所有字符是否唯一的算法问题。首先,区分ASCII和Unicode字符串,然后提供一个使用布尔数组的空间换时间解决方案。接着,探讨了在不使用额外数据结构和允许修改输入字符串时的算法。最后,扩展了主题,讨论如何检查两个字符串是否有相同的字符数。
289

被折叠的 条评论
为什么被折叠?



