程序员面试金典(1):确定字符互异(python)

来源:互联网 发布:js获取本地时间 编辑:程序博客网 时间:2024/06/05 16:01

程序员面试金典(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/20class 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/

阅读全文
0 0