document.write('
方法一:蛮力法
 最简单的方法就是把这个字符串看作一个字符数组,对该数组使用双重循环进行遍历,即对每个
字符,都将其与其后面所有的字符进行比较,如果能找到相同的字符,那么说明字符串包含重复的
字符。
 实现代码如下:
 #判断字符串中是否有相同的字符
 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个额外的存储空间。 

');