我需要在 Java 中检查一个单词是否由唯一字母组成(不区分大小写)。由于直接解决方案很无聊,我想出了:
- 对于字符串中的每个字符检查是否
indexOf(char) == lastIndexOf(char)
.
- 将所有字符添加到
HashSet
并检查设置大小是否==字符串长度。
- 将字符串转换为 char 数组,按字母顺序排序,循环遍历数组元素并检查是否
c[i] == c[i+1]
.
目前我最喜欢#2,似乎是最简单的方法。还有其他有趣的解决方案吗?
I don't like 1. -- it's an O(N2) algorithm. Your 2. is roughly linear, but always traverses the entire string. Your 3. is O(N lg2 N), with (probably) a relatively high constant -- probably almost always slower than 2.
然而,我的偏好是,当您尝试将字母插入集合中时,检查它是否已经存在,如果存在,您可以立即停止。考虑到字母的随机分布,这平均只需要扫描一半的字符串。
编辑:两个注释都是正确的,您期望扫描的字符串的确切部分将取决于分布和长度——在某些时候,字符串足够长,重复是不可避免的,并且(例如)缺少一个字符这么说来,几率还是蛮高的。事实上,给定一个平坦的随机分布(即,集合中的所有字符都有相同的可能性),这应该与生日悖论非常吻合,这意味着碰撞的机会与集合中可能的字符数的平方根有关。字符集。举例来说,如果我们假设基本 US-ASCII(128 个字符)具有相同的概率,则在 14 个字符左右发生冲突的可能性为 50%。当然,在真实的字符串中,我们可能会期望它比这更早,因为在大多数字符串中 ASCII 字符的使用频率并不接近相同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)