经典面试题33 - 字符串有无重复字符

问题

如果判断一个字符串内有无重复字符?

假设给定字符串 ‘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

更多

经典面试100题 - 持续更新中

获取更多内容请关注微信公众号豆志昂扬:

  • 直接添加公众号豆志昂扬
  • 微信扫描下图二维码;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章