华为OD机考双机位C卷 - 字符串拼接 (Java & Python & JS & GO & C++ & C)

字符串拼接

2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷

华为OD机试双机位C卷真题目录点击查看: 【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)

题目描述

给定 M(0 < M ≤ 30)个字符(a-z),从中取出任意字符(每个字符只能用一次)拼接成长度为 N(0 < N ≤ 5)的字符串,

要求相同的字符不能相邻,计算出给定的字符列表能拼接出多少种满足条件的字符串,

输入非法或者无法拼接出满足条件的字符串则返回0。

输入描述

给定的字符列表和结果字符串长度,中间使用空格(" ")拼接

输出描述

满足条件的字符串个数

用例1

输入

aab 2

输出

2

说明

只能构成ab,ba。

用例2

输入

abc 2

输出

6

说明

可以构成:ab ac ba bc ca cb 。

解题思路

使用递归和回溯的思想来生成不同的字符串。具体的逻辑如下:

  1. 首先,我们定义一个函数 generateDistinctStrings ,这个函数接收以下参数:可用字符集 s ,目标字符串长度 length ,当前已生成的字符串 current ,已生成的结果集 result ,以及一个标记数组 used ,用来记录每个字符是否已被使用。

  2. generateDistinctStrings 函数中,首先检查当前已生成的字符串 current 的长度是否等于目标长度 length 。如果等于,说明我们已经生成了一个满足长度要求的字符串,将其添加到结果集 result 中,然后返回。

  3. 如果当前字符串 current 的长度还未达到目标长度 length ,我们就需要继续添加字符。此时,我们遍历可用字符集 s 中的每一个字符。对于每一个字符,我们首先检查它是否已经被使用(通过查看 used 数组),以及它是否与 current 的最后一个字符相同。如果字符已经被使用,或者与 current 的最后一个字符相同,我们就跳过这个字符,继续检查下一个字符。

  4. 如果一个字符未被使用,且与 current 的最后一个字符不同,我们就将它添加到 current 的末尾,然后标记这个字符为已使用,接着递归调用 generateDistinctStrings 函数,以生成下一个字符。

  5. 在递归调用返回后,我们需要取消对当前字符的使用标记,以便在后续的遍历中可以再次使用这个字符。这就是回溯的思想,即撤销之前的选择,尝试其他的选择。

以下是对应的中文伪代码:

函数 generateDistinctStrings(s, length, current, result, used)
    如果 current的长度 等于 length
        将 current 添加到 result
        返回
    对于 s中的每一个字符 c
        如果 c已被使用 或者 c与current的最后一个字符相同
            继续下一次循环
        标记 c为已使用
        generateDistinctStrings(s, length, current + c, result, used)
        取消标记 c的使用状态
posted @ 2026-03-09 23:22  华为od算法大师  阅读(2)  评论(0)    收藏  举报