【466】活字字模印刷 | 豆包MarsCode AI刷题

115 阅读3分钟

问题描述: 小U最近迷上了活字印刷,他拥有一套活字字模,其中每个字模上都刻有一个字母。给定一个字符串tiles表示字母序列,每个字母代表一个字模,小U想知道用这些字模最多可以印出多少种不同的非空字母序列。注意:每个字模只能使用一次。

测试样例: 样例1:

输入:tiles = "AAB" 输出:8

样例2:

输入:tiles = "ABC" 输出:15

样例3:

输入:tiles = "AAABBC" 输出:188

样例4:

输入:tiles = "AAABCBD" 输出:1265

解题思路:

  1. 使用回溯法来生成所有可能的非空字母序列。
  2. 使用集合来存储所有唯一的子序列,以避免重复。
  3. 定义一个辅助函数backtrack来进行回溯,参数为当前路径和剩余的tiles。
  4. 如果当前路径不为空,则将其加入集合。
  5. 遍历剩余的tiles,选择当前字符,并继续回溯。
  6. 从空路径开始回溯。
  7. 返回集合的大小,即所有唯一子序列的数量。

解题步骤:

  1. 定义一个函数solution,参数为字符串tiles。
  2. 初始化一个集合unique_sequences来存储所有唯一的子序列。
  3. 定义一个辅助函数backtrack,参数为当前路径path和剩余的tilesremaining_tiles
  4. 如果当前路径不为空,则将其加入集合unique_sequences
  5. 遍历剩余的tiles,对于每个字符,选择它并继续回溯。
  6. 从空路径和tiles开始回溯。
  7. 返回集合unique_sequences的大小。

解题代码:

def solution(tiles: str) -> int:
    # 使用集合来存储所有唯一的子序列
    unique_sequences = set()
    
    # 定义一个辅助函数来进行回溯
    def backtrack(path, remaining_tiles):
        # 如果当前路径不为空,则将其加入集合
        if path:
            unique_sequences.add(path)
        
        # 遍历剩余的tiles
        for i in range(len(remaining_tiles)):
            # 选择当前字符,并继续回溯
            backtrack(path + remaining_tiles[i], remaining_tiles[:i] + remaining_tiles[i+1:])
    
    # 从空路径开始回溯
    backtrack("", tiles)
    
    # 返回集合的大小,即所有唯一子序列的数量
    return len(unique_sequences)

if __name__ == '__main__':
    print(solution(tiles="AAB") == 8)
    print(solution(tiles="ABC") == 15)
    print(solution(tiles="AAABBC") == 188)
    print(solution(tiles="AAABCBD") == 1265)

解题思路详细解析:

  1. 我们使用回溯法来生成所有可能的非空字母序列。回溯法是一种通过递归来搜索所有可能解的方法。
  2. 我们使用一个集合unique_sequences来存储所有唯一的子序列。集合是一个不允许重复元素的数据结构。
  3. 我们定义一个辅助函数backtrack来进行回溯。这个函数有两个参数:当前路径path和剩余的tilesremaining_tiles
  4. 如果当前路径path不为空,我们将其加入集合unique_sequences
  5. 我们遍历剩余的tilesremaining_tiles,对于每个字符,我们选择它并继续回溯。这意味着我们将当前字符添加到路径中,并从剩余的tiles中移除它。
  6. 我们从空路径和tiles开始回溯。
  7. 最后,我们返回集合unique_sequences的大小,这是所有唯一子序列的数量。

复杂度分析: 时间复杂度:O(2^n * n),其中n是tiles的长度。我们需要生成所有可能的子序列,最坏情况下有2^n种可能,对于每种可能,我们需要O(n)的时间来处理。 空间复杂度:O(2^n),这是因为在最坏的情况下,集合unique_sequences可能包含所有可能的子序列,即2^n个。