【数据结构与算法-Python】变位词判断的不同方法比较
一、问题描述
所谓 “变位词” 是指两个词之间存在组成字母重新排列关系。
比如:heart
和 earth
,python
和 typhon
为了简单起见,假设参与判断的两个词 仅由小写字母构成,而且长度相等。
编写程序,判断两个词是否为 “变位词”
二、解题思路
2.1 逐个检查
将 word01
的字符逐个在 word02
中检查是否存在,如果存在,就进行标记;如果每个字符都能找到,那么两个单词就是“变位词”;否则,就不是变位词。
2.1.1 算法实现
def OneByOne(word01, word02):
L = len(word01)
tag = [False for i in range(L)]
lis01 = list(word01)
lis02 = list(word02)
for i in range(L):
for j in range(L):
if lis01[i] == lis02[j]:
tag[i] = True
if False in tag:
return False
else:
return True
2.1.2 算法分析
问题规模为:字符串中包含的字符数 n
该算法有两层循环:
外层循环遍历 word01
的每个字符,并将内层循环执行 n
次;
内层循环遍历 word02
的每个字符。
进而可以得出其算法时间复杂度为 O ( n 2 ) O(n^2) O(n2)
2.2 排序比较
将两个字符串按照字符顺序排好序,再逐个对比是否相同,如果相同,则为变位词;否则就不是变位词。
2.2.1 算法实现
def Sort(word01, word02):
lis01 = list(word01)
lis02 = list(word02)
lis01.sort()
lis02.sort()
for i in range(len(word01)):
if lis01[i] == lis02[i]:
continue
else:
return False
return True
2.2.2 算法分析
问题规模为:字符串中包含的字符数 n
该算法只有一层循环,最多执行 n
次;
但排序算法的时间复杂度为
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),大于循环的时间复杂度
O
(
n
)
O(n)
O(n)
由此可以得出其算法时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn)
2.3 暴力法
将 word01
中出现的字符进行全排列,再查看 word02
是否出现在全排列列表中。
2.3.1 算法实现
"""
利用itertools中的permutations函数
permutation(list)会返回一个列表,其中的元素是每一种全排列的元组
"""
from itertools import permutations
def Vio(word01, word02):
lis01 = list(word01)
word02 = tuple(word02)
Perm = permutations(lis01)
if word02 in Perm:
return True
else:
return False
2.3.2 算法分析
问题规模为:字符串中包含的字符数 n
该算法的最主要部分是生成 word01
的全排列,其全排列的所有可能数为
n
!
n!
n!
由此可以得出其算法时间复杂度为 O ( n ! ) O(n!) O(n!)
2.4 计数比较
对比两个字符串中每个字符(字母)出现的次数,如果26个字母出现的次数都相同,那么两个字符串是变位词;否则不是变位词。
2.4.1 算法实现
def Count(word01, word02):
count01 = [0] * 26
count02 = [0] * 26
for i in word01:
pos = ord(i) - ord('a')
count01[pos] += 1
for i in word02:
pos = ord(i) - ord('a')
count02[pos] += 1
if count01 == count02:
return True
else:
return False
2.4.2 算法分析
问题规模为:字符串中包含的字符数 n
;
该算法的最主要部分是对字符串进行计数,操作数为字符串长度 n
;
由此可以得出其算法时间复杂度为 O ( n ) O(n) O(n);