所以我遇到了一个问题."确定字符串是否包含所有唯一字符"
所以我编写了这个解决方案,将每个字符添加到一个集合中,但如果该字符已经存在,则返回false.
private static boolean allUniqueCharacters(String s) {
Set<Character> charSet = new HashSet<Character>();
for (int i = 0; i < s.length(); i++) {
char currentChar = s.charAt(i);
if (!charSet.contains(currentChar)) {
charSet.add(currentChar);
} else {
return false;
}
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
根据我正在阅读的书,这是"最佳解决方案"
public static boolean isUniqueChars2(String str) {
if (str.length() > 128)
return false;
boolean[] char_set = new boolean[128];
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i);
if (char_set[val]) {
return false;
}
char_set[val] = true;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我的实现是否比提出的更慢?我认为它是,但如果哈希查找是O(1)它们不会是相同的复杂性?
谢谢.
Swe*_*per 12
正如Amadan在评论中所说的那样,这两个解决方案具有相同的时间复杂度O(n),因为你有一个for循环遍历字符串,并且你在for循环中进行常数时间操作.这意味着运行方法所需的时间随着字符串的长度线性增加.
请注意,时间复杂性是指在更改输入大小时所需的时间变化.这不是关于相同大小的数据有多快.
对于相同的字符串,"最佳"解决方案应该更快,因为集合在数组上有一些开销.处理数组比处理集更快.但是,要实际使"最佳"解决方案有效,您需要一个长度为2 ^ 16的数组.这就是char
有多少不同的值.您还需要删除检查长度超过128的字符串.
这是空间和时间之间权衡的众多例子之一.如果你想要它更快,你需要更多的空间.如果你想节省空间,你必须放慢速度.
归档时间: |
|
查看次数: |
1366 次 |
最近记录: |