算法题

Posted woshiaotian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题相关的知识,希望对你有一定的参考价值。

题目:

已知一个矩阵

 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

以上是关于算法题的主要内容,如果未能解决你的问题,请参考以下文章

FCC 中级算法题 找到缺失的字母

字典序问题 算法实现题1-2

算法题每日一练---第22天:猜字母(String类)

算法千题案例每日一练LeetCode打卡——105.仅仅反转字母

算法千题案例每日一练LeetCode打卡——105.仅仅反转字母

算法题之统计字符串中出现最多的字母