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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值