Leetcode 面试题 01.01. 判定字符是否唯一

一、题目

题目描述:
Leetcode 面试题 01.01. 判定字符是否唯一_第1张图片

二、思路

解法一:
定义一个bool数组,如果某个字符还没出现过则将其添加到列表中,否则退出循环。
解法二:
直接使用set去重,判断去重后的字符串长度与原字符串长度是否相同。
解法三:
采用位运算的方法。
1- 首先定义一个mark,用于存储相应字符对应的位。假设长度为26位,这里我们规定字符’a’为000…000,字符’b’为000…,010,以此类推。
2- 遍历字符串astr,对于每个字符,判断其与起始字符’a’的距离。以字符’l’为例,我们可以先用ord()函数算出当前字符对应的ASCII码值,然后再进行减运算,结果得到11(因为’l’偏离‘a’11个位置),对应000…10000000000。
3- 接着我们用移位运算求出相应字符的十进制数,然后将当前字符与mark进行与运算。
(1)若返回结果等于0,则说明当前字符还没出现过,更新mark,利用或运算将对应下标位的值置为1
(2)若返回结果不等于0,则说明当前字符存在重复字符,直接返回False。
(3)如果当前字符串全部遍历完,则返回True。

左移、右移是指:在二进制中,将1向左、向右移动的位数,返回的是将二进制数转换为十进制数的结果。
两个整型变量的与运算结果是将其转化成二进制位进行逐位的比较。只要有一位不相同,则返回0,否则为非0数。

三、代码

class Solution:
	def isUnique(self, astr: str) -> bool:
  		# 解法三
    	mark = 0  # python默认整型变量位数大于26位
    	for char in astr:
      		move_bit = ord(char) - ord('a')  # ord返回当前字符的ASCII码值
      		if (mark & (1 << move_bit)) != 0:
        		return False
      		else:
        		mark |= (1 << move_bit)
    	return True
		# 解法二
		# return len(set(astr)) == len(astr)
		# 解法一
    	# temp = []
    	# for s in astr:
        	# if s in temp:
            	# return False
        	# else:
            	# temp.append(s)
    	# return True

四、时间复杂度分析

线性遍历,所以时间复杂度为:O(n)

你可能感兴趣的:(编程题)