經典面試題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題 - 持續更新中

獲取更多內容請關注微信公衆號豆志昂揚:

  • 直接添加公衆號豆志昂揚
  • 微信掃描下圖二維碼;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章