news 2026/6/11 20:18:57

(新卷,200分)- 字符串拼接(Java JS Python C)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(新卷,200分)- 字符串拼接(Java JS Python C)

(新卷,200分)- 字符串拼接(Java & JS & Python & C)

题目描述

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

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

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

输入描述

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

输出描述

满足条件的字符串个数

用例
输入abc 1
输出3
说明给定的字符为a,b,c,结果字符串长度为1,可以拼接成a,b,c,共3种
输入dde 2
输出2
说明给定的字符为dde,结果字符串长度为2,可以拼接成de,ed,共2种
题目解析

根据用例2的说明来看,本题是要求解的是:不重复的指定长度的排列。且本题还增加了一个条件,即排列中相邻元素不能相同。

本题的基础是求解排列。

了解的排列的求解后,我们就可以进一步了解不重复的排列求解

而本题只需要在这两题的基础增加:排列中相邻元素不能相同即可。

JS算法源码
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; void (async function () { let [s, n] = (await readline()).split(" "); n = parseInt(n); function getResult() { if (s.length < n) { // 无法拼接出满足条件的字符串 return 0; } for (let c of s) { // 输入非法 if (c < "a" || c > "z") return 0; } // 排序cArr,可以方便后面求解全排列时,进行树层去重 const cArr = [...s].sort(); return dfs(cArr, -1, 0, new Array(cArr.length).fill(false), 0); } /** * 全排列求解 * @param {*} cArr 基于cArr数组求解全排列 * @param {*} pre 排列最后一个字符在cArr中的位置 * @param {*} level 排列的长度 * @param {*} used used[i] 用于标记 cArr[i] 元素是否已使用 * @param {*} count 符号要求的排列有几个 * @returns count */ function dfs(cArr, pre, level, used, count) { // 当排列长度到达n,则是一个符合要求的排列 if (level == n) { // 符合要求的排列个数+1 return ++count; } for (let i = 0; i < cArr.length; i++) { // 每个字符只能用一次 if (used[i]) continue; // 相同的字符不能相邻, pre指向前面一个被选择的字符的在cArr中的位置,i指向当前被选择的字符在cArr中的位置 if (pre >= 0 && cArr[i] == cArr[pre]) continue; // 树层去重(去除重复排列) if (i > 0 && cArr[i] == cArr[i - 1] && !used[i - 1]) continue; used[i] = true; count = dfs(cArr, i, level + 1, used, count); used[i] = false; } return count; } console.log(getResult()); })();
Java算法源码
import java.util.Arrays; import java.util.Scanner; public class Main { static String s; static int n; public static void main(String[] args) { Scanner sc = new Scanner(System.in); s = sc.next(); n = sc.nextInt(); System.out.println(getResult()); } public static int getResult() { if (s.length() < n) { // 无法拼接出满足条件的字符串 return 0; } char[] cArr = s.toCharArray(); for (char c : cArr) { // 输入非法 if (c < 'a' || c > 'z') return 0; } // 排序cArr,可以方便后面求解全排列时,进行树层去重 Arrays.sort(cArr); return dfs(cArr, -1, 0, new boolean[cArr.length], 0); } /** * 全排列求解 * * @param cArr 基于cArr数组求解全排列 * @param pre 排列最后一个字符在cArr中的位置 * @param level 排列的长度 * @param used used[i] 用于标记 cArr[i] 元素是否已使用 * @param count 符号要求的排列有几个 * @return count */ public static int dfs(char[] cArr, int pre, int level, boolean[] used, int count) { // 当排列长度到达n,则是一个符合要求的排列 if (level == n) { // 符合要求的排列个数+1 return ++count; } for (int i = 0; i < cArr.length; i++) { // 每个字符只能用一次 if (used[i]) continue; // 相同的字符不能相邻, pre指向前面一个被选择的字符的在cArr中的位置,i指向当前被选择的字符在cArr中的位置 if (pre >= 0 && cArr[i] == cArr[pre]) continue; // 树层去重(去除重复排列) if (i > 0 && cArr[i] == cArr[i - 1] && !used[i - 1]) continue; used[i] = true; count = dfs(cArr, i, level + 1, used, count); used[i] = false; } return count; } }
Python算法源码
# 输入获取 s, n = input().split() n = int(n) # 全排列求解 def dfs(cArr, pre, level, used, count): """ 全排列求解 :param cArr: 基于cArr数组求解全排列 :param pre: 排列最后一个字符在cArr中的位置 :param level: 排列的长度 :param used: used[i] 用于标记 cArr[i] 元素是否已使用 :param count: 符号要求的排列有几个 :return: count """ # 当排列长度到达n,则是一个符合要求的排列 if level == n: # 符合要求的排列个数+1 count += 1 return count for i in range(len(cArr)): # 每个字符只能用一次 if used[i]: continue # 相同的字符不能相邻, pre指向前面一个被选择的字符的在cArr中的位置,i指向当前被选择的字符在cArr中的位置 if pre >= 0 and cArr[i] == cArr[pre]: continue # 树层去重(去除重复排列) if i > 0 and cArr[i] == cArr[i - 1] and not used[i - 1]: continue used[i] = True count = dfs(cArr, i, level + 1, used, count) used[i] = False return count # 算法入口 def getResult(): if len(s) < n: # 无法拼接出满足条件的字符串 return 0 for c in s: if c < 'a' or c > 'z': # 输入非法 return 0 cArr = list(s) # 排序cArr,可以方便后面求解全排列时,进行树层去重 cArr.sort() return dfs(cArr, -1, 0, [False] * len(cArr), 0) # 算法调用 print(getResult())
C算法源码
#include <stdio.h> #include <stdlib.h> #define MAX_SIZE 31 char s[MAX_SIZE]; int s_len; int n; /*! * 全排列求解 * @param pre 排列最后一个字符在cArr中的位置 * @param level 排列的长度 * @param used used[i] 用于标记 s[i] 元素是否已使用 * @param count 符号要求的排列有几个 * @return count */ int dfs(int pre, int level, int used[], int count) { // 当排列长度到达n,则是一个符合要求的排列 if (level == n) { // 符合要求的排列个数+1 return ++count; } for (int i = 0; i < s_len; i++) { // 每个字符只能用一次 if (used[i]) continue; // 相同的字符不能相邻, pre指向前面一个被选择的字符的在s中的位置,i指向当前被选择的字符在s中的位置 if (pre >= 0 && s[i] == s[pre]) continue; // 树层去重(去除重复排列) if (i > 0 && s[i] == s[i - 1] && !used[i - 1]) continue; used[i] = 1; count = dfs(i, level + 1, used, count); used[i] = 0; } return count; } int cmp(const void *a, const void *b) { return *((char *) a) - *((char *) b); } int getResult() { int i = 0; while (s[i] != '\0') { // 输入非法 if (s[i] < 'a' || s[i] > 'z') return 0; i++; } s_len = i; if (s_len < n) { // 无法拼接出满足条件的字符串 return 0; } // 排序s,可以方便后面求解全排列时,进行树层去重 qsort(s, i, sizeof(char), cmp); int used[MAX_SIZE] = {0}; return dfs(-1, 0, used, 0); } int main() { scanf("%s", s); scanf("%d", &n); printf("%d\n", getResult()); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 0:49:29

布隆过滤器

一、布隆过滤器 1. 什么是布隆过滤器&#xff1f; 布隆过滤器是一种空间效率极高的概率型数据结构&#xff0c;核心作用是快速判断「一个元素是否存在于集合中」。它的特点可以总结为&#xff1a; 说「元素不在」→ 100%准确&#xff08;绝对没在集合里&#xff09;&#xff1b…

作者头像 李华
网站建设 2026/6/9 22:14:51

【JESD22-B109C】倒装芯片拉伸测试

B109C 测试方法&#xff1a;Flip Chip Tensile Pull 倒装芯片拉伸测试1 范围本测试方法适用于芯片与基板焊点形成后、未涂覆底部填充胶或其他会提高表观结合强度的材料前的倒装芯片。其用途包括&#xff1a;评估特定倒装芯片的芯片接合工艺一致性与质量&#xff1b;评估特定倒装…

作者头像 李华
网站建设 2026/6/10 14:34:11

2025年应届生闭坑指南:如何挑选低费用、高认可度的AI技能证书?

随着人工智能技术席卷各行各业&#xff0c;手握相关技能证书已成为应届毕业生提升就业竞争力的重要筹码。然而&#xff0c;面对市场上琳琅满目、价格不一的认证项目&#xff0c;许多同学不禁感到迷茫&#xff1a;如何避开“高价低能”的坑&#xff0c;选择一款既具高含金量又不…

作者头像 李华
网站建设 2026/6/11 10:45:13

基于YOLOv12农作物检测系统1:农作物检测数据集说明(含下载链接)

一. 前言 本篇博客是《基于YOLOv12农作物检测系统》系列文章之《农作物检测数据集说明(含下载链接)》&#xff0c;网上有很多农作物检测数据集的数据&#xff0c;百度一下&#xff0c;一搜一大堆&#xff0c;但质量参差不齐&#xff0c;很多不能用&#xff0c;即使一个一个的看…

作者头像 李华
网站建设 2026/6/11 11:00:10

pip遇到依赖冲突警告时候的排查办法

使用pip安装的时候遇到了以下的依赖冲突问题&#xff0c;解决流程记录一下&#xff0c;相似的过程可以进行排查: (hello-agent) tipriestUranus:~/Documents/hello-agents/code/chapter15/Helloagents-AI-Town/backend (main*) $ pip install -r requirements.txt Collecting …

作者头像 李华