经典面试题33 - 字符串有无重复字符
2019-04-07 本文已影响0人
豆志昂扬
问题
如果判断一个字符串内有无重复字符?
假设给定字符串 ‘abca’, 其中字符a重复出现。
解答
如果没有更多的条件限制,这个题目还是很简单的。但如果加上不允许定义附加的数据结构的限制,实现会复杂很多,有兴趣的可以做个家庭作业。
我们这里来分享没有条件限制的思路来抛砖引玉。第一眼看到题目中的无重复字符要求,很容易想到的就是Hash表,在从头到尾遍历字符串的时候,需定义一个Hash表来存储遍历到的字符,如果发现Hash表不包括正在遍历字符的,把起插入到Hash表内,如果Hash表包括正在遍历字符,则表示字符串内有重复字符,直接返回失败结果。
下面是Swift针对上述思路的源码实现:
func hasUniqueCharacters() -> Bool {
var uniqueCharacters = Set<Character>()
for c in characters {
guard !uniqueCharacters.contains(c) else { return false }
uniqueCharacters.insert(c)
}
return true
}
还有一个很有意思的思路,让人有种眼前一亮的感觉。
假设字符串的字符集是固定的,比如是26个字母,或ASCII编码等,我们定义一个数组,其长度就是字符集的长度,其中预先填充所有值为False。 然后从前向后遍历字符串,如果当前字符的值-Value在数组里对应的值是False,表示首次出现,把其标示为True,并继续对字符串遍历,如果当前字符的值-Value在数组里对应的值是True,则表示字符的重复出现。
我们来看看Python的实现源码。
def unique(string):
# 假设字符串中的字符编码集是 ASCII (128 个)
if len(string) > 128:
return False
char_set = [False for _ in range(128)]
for char in string:
val = ord(char)
if char_set[val]:
# 字符已经存在
return False
char_set[val] = True
return True
更多
获取更多内容请关注微信公众号豆志昂扬:
- 直接添加公众号豆志昂扬;
- 微信扫描下图二维码;