阿里云ECS七天训练营之编程挑战

题目:Jerry的挑战

前言:

阿里云推出的高校师生计划,近期内仍可通过学生/老师/科研工作者的身份申请为期半年的免费ECS资源,对云服务器、云计算等方面感兴趣的小伙伴不要错过!

题目描述:

有一天Jerry给Tom出了一道题来考验他。
Jerry给了Tom一个长度为2*n的只包含小写字母的字符串,让Tom将这个字符串任意挑选字符,将其分成两个等长的字符串a和b(对于一个si不能同时被选到a和b中),然后a要和reverse(b)相同(a和反转后的b相同),问这样的方案数有多少?Tom有些为难,所以请你来帮帮他吧。

输入一个正整数n,和一个长度为2*n的字符串。

输出方案数。

示例1
输入:
2
“abba”
输出:
4

题目分析:

首先搞懂题意,将长度为2*n的字符串划分为两个长度为n的子串a和b,原字符串中每个字符只能使用一次,且不改变字符之间的相对顺序。要求子串a的序列等于子串b逆置后的序列。不同位置的相同字符是独立的,即:
示例中的abba可以表示为a₁b₁b₂a₂,故示例1的划分方案共有四种:
方案1:子串a:a₁b₁; 子串b:b₂a₂
方案2:子串a:a₁b₂; 子串b:b₁a₂
方案3:子串a:b₁a₂; 子串b:a₁b₂
方案4:子串a:b₂a₂; 子串b:a₁b₁
可以看到子串a和子串b的结果是对称的,求解时只需考虑子串a或子串b的排列可能结果数,再乘2即得最终结果。

算法设计:

这部分后期完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值