問題
如果判斷一個字符串內有無重複字符?
假設給定字符串 ‘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
更多
獲取更多內容請關注微信公衆號豆志昂揚:
- 直接添加公衆號豆志昂揚;
- 微信掃描下圖二維碼;