題目:
已知一個矩陣
matrix = [
['A', 'P', 'H', 'S'],
['U', 'L', 'O', 'A'],
['O', 'M', 'L', 'K'],
['F', 'B', 'I', 'R'],
]
在矩陣中查找多個字符串,字符串的數量可能很多
["LFK", "HMM", "RPOOI"]
對於字符串”LFK”,它由3個字符組成,’L’、’F’、’K’
這三個字符在矩陣中的位置分別爲(1,1),(3,0),(2,3)
對於這個三個字符串分別返回
LFK
True, [(1,1),(3,0),(2,3)]
HMM
矩陣中的每個字符只能被使用一次,字符M
在矩陣中只有一個,因此 HMM
無法找到
False, []
RPOOI
True, [(3,3),(0,1),(1,2),(2,0),(3,2)]
分析
矩陣中的字符數量有限(全是大寫字母),且每個字符只能被使用一次,由於待查的字符串數量很多,所以需要爲查找建立索引
最終代碼如下:
# encoding=utf-8
from collections import defaultdict
def get_position(matrix, str_list):
# 初始化索引
dd = defaultdict(list)
for i in range(len(matrix)):
for j in range(len(matrix[i])):
ch = matrix[i][j]
dd[ch].append((i, j))
# deal
res = []
for ss in str_list:
print ss
curr_dd = defaultdict(int)
flag = True
position_list = []
for ch in ss:
curr_dd[ch] += 1
if curr_dd[ch] <= len(dd[ch]):
position_list.append(dd[ch][curr_dd[ch] - 1 ])
else:
flag = False
res.append((False, []))
break
if flag:
res.append((True, position_list))
return res
if __name__ == '__main__':
matrix = [
['A', 'P', 'H', 'S'],
['U', 'L', 'O', 'A'],
['O', 'M', 'L', 'K'],
['F', 'B', 'I', 'R'],
]
str_list = ["ISIS", "ALLAHU"]
res = get_position(matrix, str_list)
for item in res:
print item