题目: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即得最终结果。
算法设计:
这部分后期完成。