算法題(6)

題目:

已知一個矩陣

 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章