python 确定字符互异

100 篇文章 0 订阅
# -*- coding:utf-8 -*-
'''
请实现一个算法,确定一个字符串的所有字符是否全都不同。
这里我们要求不允许使用额外的存储结构。
给定一个string iniString,
请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。
保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。

解法1:将字符串中的每个字符与其余字符进行比较,时间复杂度为O(n**2),空间复杂度为O(1)
解法2:由于题目中有提到,字符串中的字符都是ASCII码,则它转换成int数值后是0-255之间
        构建哈希表解决即可
解法3:对输入的字符串进行排序,再检查是否有相邻的两个元素相等的情况

'''
class Different:
    def checkDifferent_1(self, iniString):
        # write code here
        if len(iniString)<=1:
            return True
        else:
            for i in range(len(iniString)):
                for j in range(i+1,len(iniString)):
                    if iniString[i]==iniString[j]:
                        return False
            return True

    def checkDifferent_2(self, iniString):
        if len(iniString)<=1:
            return True
        else:
            hash_table=[0 for i in range(256)]
            for c in iniString:
                # python中将字符转换成ASCII码值的函数 ord(char)
                # python中将ASCII码值转换成字符的函数 chr(int)
                if hash_table[ord(c)]==1:
                    return False
                else:
                    hash_table[ord(c)]=1
            return True

    def quick_sort(self,input_str):
        if len(input_str)<=1:
            return input_str
        # 返回对输入字符串进行快速排序的结果
        povit_value=input_str[0]
        start=0
        end=len(input_str)-1
        # start和end指针交替有效,保证每次进入while循环的时候,start无效,end有效
        while(1):
            while(end>start):
                if input_str[end]>=povit_value:
                    end-=1
                else:
                    break
            if end==start:
                break
            else:
                # print('here',input_str[start],input_str[end],type(input_str[end]))
                input_str[start]=input_str[end]
            start+=1
            while(start<end):
                if input_str[start]<=povit_value:
                    start+=1
                else:
                    break
            if start==end:
                break
            else:
                input_str[end]=input_str[start]
        return self.quick_sort(input_str[:end])+[povit_value]+self.quick_sort(input_str[(end+1):])

    def checkDifferent(self, iniString):
        # 字符之间可以直接比较大小,字符之间比较大小的方式就是它们的ASCII码谁大谁小
        # 使用快速排序算法对输入的字符串进行排序
        iniInt=list(map(lambda x:ord(x),iniString))
        sorted_str=self.quick_sort(iniInt)
        for i in range(1,len(sorted_str)):
            if sorted_str[i]==sorted_str[i-1]:
                return False

        return True

if __name__=="__main__":
    print(Different().checkDifferent("aeiou"
                                     ))
    print(Different().checkDifferent("BarackObama"
))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值