字符串拼接构成校验算法咨询:判断目标长串能否由给定短串可重复、任意顺序拼接生成
完全可落地的算法实现指引
先解答你纠结的技术选型疑问
你目前疑惑是否需要用到运算符重载、复杂子序列检查这类技术点——这个担心完全是多余的,这两类技术点在本问题的常规最优解法里基本不会涉及,不需要为此提前做额外的编码准备,把注意力放在状态设计上就能顺利完成实现。
核心算法的完整实现逻辑
这个问题属于经典的字符串可达性判定场景,用最基础的动态规划就能落地实现,完全适配题目里“短串可任意排序、可重复使用0次或多次”的规则:
- 定义状态数组:
dp[i]表示目标长字符串的前i个字符组成的前缀,是否可以完全由给定的短字符串集合拼接构成 - 初始边界:
dp[0] = true,即长度为0的空前缀天然满足拼接要求 - 逐位置做状态转移:
- 从位置1遍历到目标字符串的总长度
n - 对每个位置
i,逐个匹配所有给定的短字符串:- 先做长度快速校验:如果当前短串长度超过
i,直接跳过,不做后续比对 - 提取目标长串中、从
i - 短串长度位置开始的等长子串,和当前短串做严格相等比对 - 如果比对完全相等,且对应前置位置的状态
dp[i - 短串长度] == true,则将当前位置的dp[i]标记为可达(即赋值为true),可以直接跳出当前位置的短串遍历循环,节省计算量
- 先做长度快速校验:如果当前短串长度超过
- 从位置1遍历到目标字符串的总长度
- 最终结果:当遍历完成后,直接返回
dp[n]的值,就是问题的判定答案
实现层面的实用优化技巧
- 提前把所有短字符串的长度去重存在集合里,判断前先检查当前位置可截取的子串长度是否在这个集合内,能大幅减少无意义的字符串拷贝、比对操作
- 整个过程不需要额外模拟短串的拼接过程,因为动态规划的转移逻辑已经天然覆盖了“短串可任意顺序、可重复使用”的规则:状态转移时不会限制短串的选择顺序,也不会对已经使用过的短串做计数限制,完全匹配题目要求
C++编码时的小提醒
- 使用
std::string的substr方法时注意接口语义:参数依次是「截取的起始下标」、「要截取的字符长度」,不要和其他语言的参数顺序混淆 - 提前处理边界情况:如果目标长字符串本身长度为0,直接返回判定为“可拼接构成”即可
内容的提问来源于stack exchange,提问作者currently_into_ai
相关产品推荐
相关产品推荐

