问答题 6.  判断一个字符串是否包含重复字符。例如:“good”就包含重复字符‘o’,而“abc”就不包含重复字符。
【正确答案】方法一:蛮力法
   最简单的方法就是把这个字符串看作一个字符数组,对该数组使用双重循环进行遍历,即对每个字符,都将其与其后面所有的字符进行比较,如果能找到相同的字符,那么说明字符串包含重复的字符。
   实现代码如下:
   #判断字符串中是否有相同的字符
   def isDup(strs):
   lens=len(strs)
   i=0
   while i<lens:
   j=i+1
   while j<lens:
   if list(strs)[j]==list(strs)[i]:
   return True
   j+=1
   i+=1
   return False
   
   if __name__=="__main__":
   strs="GOOD"
   result=isDup(strs)
   if result:
   print strs+"中有重复字符"
   else:
   print strs+"中没有重复字符"
   程序的运行结果为:
   GOOD中有重复字符
   算法性能分析:
   由于这种方法使用了双重循环对字符数组进行了遍历,因此,算法的时间复杂度为O(N2)(其中,N是指字符串的长度)。
   方法二:空间换时间
   在算法中经常会采用空间换时间的方法。对于这个问题,也可以采取这种方法。其主要思路如下:由于常见的字符只有256个,假设这道题涉及的字符串中不同的字符个数最多为256个,那么可以申请一个大小为256的int类型数组来记录每个字符出现的次数,初始化都为0,把这个字符的编码作为数组的下标,在遍历字符数组的时候,如果这个字符在数组中对应的值为0,那么把它置为1,如果为1,那么说明这个字符在前面已经出现过了,因此,字符串包含重复的字符。采用这种方法只需要对字符数组进行一次遍历即可,因此,时间复杂度为O(N),但是需要额外申请256个单位的空间。由于申请的数组用来记录一个字符是否出现,只需要1bit也能实现这个功能,因此,作为更好的一种方案,可以只申请大小为8的int类型的数组,由于每个int类型占32bit,所以,大小为8的数组总共为256bit,用1bit来表示一个字符是否已经出现过可以达到同样的目的,实现代码如下:
   def isDup(strs):
   lens=len(strs)
   flags=[None]*8 #只需要8个32位的int, 8*32=256位
   i=0
   while i<8:
   flags[i]=0
   i+=1
   i=0
   while i<lens:
   index=ord(list(strs)[i])/32
   shift=ord(list(strs)[i])%32
   if (flags[index]&(1<<shift))!=0:
   return True
   fiags[index]|=(1<<shift)
   return False
   
   if __name__=="__main__":
   strs="GOOD"
   result=isDup(strs)
   if result:
   print strs+"中有重复字符"
   else:
   print strs+"中没有重复字符"
   程序的运行结果为:
   GOOD中有重复字符
   算法性能分析:
   由于这种方法对字符串进行了一次遍历,因此算法的时间复杂度为O(N)(其中,N是指字符串的长度)。此外,这种方法申请了8个额外的存储空间。
【答案解析】

[考点] 如何判断一个字符串是否包含重复字符。