乱序字符串定义
显示不同量级的算法的一个很好的例子是字符串的乱序检查。乱序字符串是指一个字符串只是另一个字符串的重新排列。例如,‘heart’ 和’earth’ 就是乱序字符串。‘python’ 和 ‘typhon’ 也是。为了简单起见,我们假设所讨论的两个字符串具有相等的长度,并且他们由 26 个小写字母集合组成。我们的目标是写一个布尔函数,它将两个字符串做参数并返回它们是不是乱序。
求解方法
解法1
采用穷举法。穷举s1所有的排列方式,判断s2是否属于其中。当s1生成所有排列方式时,第一个位置有n种可能,第二个位置有n-1种,以此类推,所以算法时间复杂度是O(n!)O(n!)O(n!),不可取。
解法2
检查s1中的每一个字符是否出现在s2中,如果均可检测到,则为乱序。可在检测过程中将出现在第s2中的对应字符删除。代码如下
def nagramSolution2(s1,s2):
alist = list(s2) #将字符串2转化为列表(可变数据类型,方便进行删除操作)
pos1 = 0
still_ok = True
while pos1 < len(s1) and still_ok:
pos2 = 0
found = False
while pos2 < len(alist) and not found:
if s1[pos1] == alist[pos2]:
found = True #在该位置找到对应字符,根据条件跳出内循环
alist.pop(pos2) #将列表对应字符删除
else:
pos2 += 1
if not found:
still_ok = False #s1中的某一字符未在s2对应的列表里出现,根据条件退出大循环,返回False
pos1 += 1
return still_ok
该算法包含内外