E卷-字符串拼接(200分)

字符串拼接

LYA最近迷上了一款字符串拼接游戏。游戏规则如下:

给定一个由小写字母组成的字符集合,以及一个正整数 。从字符集合中任意取出字符(每个字符只能用一次),拼接成一个长度为 的字符串,要求相邻的字符不能相同。

请帮助LYA计算出,给定的字符集合能拼接出多少种满足条件的字符串。如果输入非法或无法拼接出满足条件的字符串,则输出

输入格式

输入为一行,包含一个由小写字母组成的字符串和一个正整数 ,两者之间用一个空格分隔。

  • 字符串长度

输出格式

输出一个整数,表示能拼接出的满足条件的字符串个数。

样例输入

abc 1

样例输出

3

样例解释

给定的字符集合为 abc,结果字符串长度为 ,可以拼接出 abc 三种字符串,因此输出

样例输入

dde 2

样例输出

2

样例解释

给定的字符集合为 dde,结果字符串长度为 ,可以拼接出 deed 两种字符串,因此输出

数据范围

  • 字符串长度

题解

本题可以用回溯法(DFS)来解决。

我们定义一个布尔数组 vis 来记录每个字符是否被使用过。然后从字符集合的第一个字符开始,尝试将它加入结果字符串。如果当前字符没有被使用过,且与结果字符串的最后一个字符不同,就将它加入结果字符串,并标记为已使用。

接下来,我们继续尝试从剩余的未使用字符中选择下一个字符,直到结果字符串的长度达到 。如果能够成功构造出一个满足条件的字符串,就将答案加一。

在尝试每一步时,我们都需要跳过重复的字符,以避免重复计算。这可以通过对字符集合进行排序,然后在遍历时跳过连续相同的字符来实现。

时间复杂度为 ,其中 为结果字符串的长度, 为字符集合的长度。空间复杂度为 ,用于存储字符集合和访问数组。

参考代码

  • Python
from itertools import permutations

def count_strings(chars, n):
    res = 0
    for perm in permutations(chars, n):
        if all(perm[i] != perm[i+1] for i in range(n-1)):
            res += 1
    return res

chars, n = input().split()
n = int(n)
print(count_strings(chars, n))
  • Java
import java.util.*;

public class Main {
    static int k;
    static char[] cs;
    static int res;
    static boolean[] vis;
    static StringBuilder sb = new StringBuilder();
   

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

评论
2
1
分享
牛客网
牛客企业服务