程序員面試金典(1):確定字符互異(python)

程序員面試金典(1):確定字符互異(python)

題目描述

請實現一個算法,確定一個字符串的所有字符是否全都不同。這裏我們要求不允許使用額外的存儲結構。

給定一個string iniString,請返回一個bool值,True代表所有字符全都不同,False代表存在相同的字符。保證字符串中的字符爲ASCII字符。字符串的長度小於等於3000。

測試樣例:

"aeiou"
返回:True
"BarackObama"
返回:False

方法1

最簡單的解法是將字符串中的每一個字符與剩下的字符比較,如果遇到相同的元素,則返回False,如果直到遍歷結束都沒有遇到相同元素,則返回True:這種解法的時間複雜度爲O(n*n),空間複雜度爲O(1)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Created by xuehz on 2017/8/20

class Different:
    def checkDifferent(self, iniString):
        # write code here
        str_len = len(iniString)

        if str_len > 256:
            return True
        for pos in xrange(str_len):
            for index in xrange(pos + 1, str_len):
                if iniString[pos] == iniString[index]:
                    return False
        return True

方法2:

構建一個布爾的數組,索引值i對應的標記指示該字符串是否含有字母表中的第i個字符。若第二次出現,則立即返回false。若字符編碼是ASCII字符集,則總共只有256個字符,若總長度超過了必定有重複。

def checkDifferent1(self, iniString):
    str_len = len(iniString)

    if str_len > 256:
        return True
    record = [False] * 256
    for ch in iniString:
        ch_val = ord(ch)

        if record[ch_val]:
            return False
        record[ch_val] = True
    return True

上面代碼的時間複雜度爲O(n),空間複雜度爲O(1)

方法3:

我們還有一種O(nlog(n))的算法來解決這個問題:將字符串排序,然後遍歷每一個元素並與周圍元素比較

def checkDifferent2(self, iniString):
    str_len = len(iniString)

    if str_len > 256:
        return True
    ll = list(iniString)
    ll.sort()
    #print ll
    for i in xrange(1,len(ll)):
        if ll[i] == ll[i-1]:
            return False
    return True

chr(u) 和ord(i)

中文說明:

返回整數i對應的ASCII字符。與ord()作用相反。
參數x:取值範圍[0, 255]之間的正數

20170820150323187280268.png

20170820150323188171905.png

參考:

http://blog.csdn.net/yabg_zhi_xiang/article/details/52099301

http://python.jobbole.com/85577/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章