1、问题
1.1 问题描述
某特种部队采用了一套性格密码机制来筛选执行特定任务的最佳士兵,该机制的规则如下:
- 每个人的性格可以通过
M个维度来描述,每个维度分为A, B, C, D, E五种类型。 - 同一维度内,字母距离越近,性格类型差异越小,匹配程度越高。比如,A 和 B 的差异为
1,A 和 D 的差异为3。 - 其中
AE、BD、CE、BE为不相容性格类型,差异值设为无穷大(无法匹配)。 - 如果某一维度存在不相容性格类型,则表示两个士兵性格完全不匹配。
- 对于符合匹配条件的士兵,差异值总和越小表示匹配程度越高。
现在,有一个重要的机密任务,要求找到最匹配该任务所需性格密码的士兵。你需要编写一个算法,帮助部队找到符合条件的最佳人选。
m表示性格密码的维度。n表示备选特种兵的数量。target是代表任务的性格密码。array是一个包含n个元素的列表,每个元素为M位的性格密码。
1.2 测试样例
样例1:
输入:
m = 6, n = 3, target = "ABCDEA", array = ["AAAAAA", "BBBBBB", "ABDDEB"]
输出:'ABDDEB'
样例2:
输入:
m = 5, n = 4, target = "ABCED", array = ["ABCDE", "BCDEA", "ABDCE", "EDCBA"]
输出:'ABCDE'
样例3:
输入:
m = 4, n = 4, target = "AEBC", array = ["ACDC", "BBDC", "EBCB", "BBBB"]
输出:'None'
2、思路
2.1 问题理解
首先,我们需要理解问题的核心:找到与目标性格密码最匹配的士兵。匹配的规则包括:
- 每个维度的性格类型有五种:A, B, C, D, E。
- 同一维度内,字母距离越近,性格类型差异越小。
- 存在不相容性格类型,差异值为无穷大。
- 如果某一维度存在不相容性格类型,则表示两个士兵性格完全不匹配。
- 对于符合匹配条件的士兵,差异值总和越小表示匹配程度越高。
2.2 不相容性格类型的处理
我们需要识别并处理不相容的性格类型。不相容性格类型包括:AE, EA, BD, DB, CE, EC, BE, EB。如果目标性格密码和某个士兵的性格密码在同一维度上出现这些组合,则该士兵直接被排除。
# 不相容性格列表
incompatible_list = [
"AE", "EA",
"BD", "DB",
"CE", "EC",
"BE", "EB"
]
2.3 差异值的计算
对于每个维度的性格类型,我们需要计算其差异值。差异值的计算方法是通过字母的ASCII码值的差值来确定。例如,A和B的差异为1,A和D的差异为3。
temp_difference += abs(ord(array[i][j]) - ord(target[j])) # 计算当前维度的差异值
2.4 最佳匹配的选择
在遍历所有备选士兵的过程中,我们需要记录当前最小的差异值,并更新最佳匹配的性格密码。如果有多个士兵的差异值相同且最小,则将这些士兵的性格密码都记录下来。
if not have_incompatible:
if temp_difference < difference: # 如果当前差异值小于最小差异值
result = array[i] # 更新最佳匹配性格密码
difference = temp_difference # 更新最小差异值
elif temp_difference == difference: # 如果当前差异值等于最小差异值
result = result + " " + array[i] # 将当前性格密码添加到结果中
difference = temp_difference # 更新最小差异值
2.5 初始化和返回结果
初始化差异值为最大值,并遍历所有备选士兵。如果没有找到匹配的士兵,则返回'None'。
result = "" # 用于存储最终匹配的性格密码
difference = sys.maxsize # 初始化差异值为最大值
for i in range(n): # 遍历所有备选特种兵
have_incompatible = False # 初始化不相容标志为False
temp_difference = 0 # 初始化当前特种兵的差异值为0
for j in range(m): # 遍历每个维度的性格类型
compare_one = target[j] + array[i][j] # 组合目标性格和当前特种兵的性格
if compare_one in incompatible_list: # 检查是否存在不相容性格
have_incompatible = True # 标记为不相容
break
else:
temp_difference += abs(ord(array[i][j]) - ord(target[j])) # 计算当前维度的差异值
# 如果不存在不相容性格
if not have_incompatible:
if temp_difference < difference: # 如果当前差异值小于最小差异值
result = array[i] # 更新最佳匹配性格密码
difference = temp_difference # 更新最小差异值
elif temp_difference == difference: # 如果当前差异值等于最小差异值
result = result + " " + array[i] # 将当前性格密码添加到结果中
difference = temp_difference # 更新最小差异值
return result if difference != sys.maxsize else 'None' # 返回最佳匹配性格密码,如果没有匹配则返回'None'
3、代码
整体代码如下:
def solution(m, n, target, array):
result = "" # 用于存储最终匹配的性格密码
difference = sys.maxsize # 初始化差异值为最大值
# 不相容性格列表
incompatible_list = [
"AE", "EA",
"BD", "DB",
"CE", "EC",
"BE", "EB"
]
for i in range(n): # 遍历所有备选特种兵
have_incompatible = False # 初始化不相容标志为False
temp_difference = 0 # 初始化当前特种兵的差异值为0
for j in range(m): # 遍历每个维度的性格类型
compare_one = target[j] + array[i][j] # 组合目标性格和当前特种兵的性格
if compare_one in incompatible_list: # 检查是否存在不相容性格
have_incompatible = True # 标记为不相容
break
else:
temp_difference += abs(ord(array[i][j]) - ord(target[j])) # 计算当前维度的差异值
# 如果不存在不相容性格
if not have_incompatible:
if temp_difference < difference: # 如果当前差异值小于最小差异值
result = array[i] # 更新最佳匹配性格密码
difference = temp_difference # 更新最小差异值
elif temp_difference == difference: # 如果当前差异值等于最小差异值
result = result + " " + array[i] # 将当前性格密码添加到结果中
difference = temp_difference # 更新最小差异值
return result if difference != sys.maxsize else 'None' # 返回最佳匹配性格密码,如果没有匹配则返回'None'
4、运行结果
可以看到提交通过,说明我们的方法和代码都没有问题。
5、总结分析
5.1 时间复杂度
- 外层循环遍历所有备选士兵,时间复杂度为
O(n)。 - 内层循环遍历每个维度的性格类型,时间复杂度为
O(m)。 - 因此,总的时间复杂度为
O(n * m)。
5.2 空间复杂度
- 主要的空间开销在于存储结果和临时变量。
- 结果存储在
result字符串中,临时变量包括have_incompatible和temp_difference。 - 因此,空间复杂度为O(1),即常数空间复杂度。