阿里云七天训练营入门班_Day5


提交记录

提交记录


题目:
有一天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


  1. 题意理解:
    从右向左抽出n个字符作为a,剩下的字符作为b,a与b字符串的顺序相反。
  2. 思路:
    用深度优先算法DFS将各种可能的字符串穷举出来,同时运用对称性来减小时间复杂度。
    例如“cabaacba”,如果‘c’为a的第一个字符,则b的最后一个字符也是‘c’,而第二个‘c’后面的‘ba’则一定是属于a字符串的,这样就能大大减小时间复杂度。

在使用dfs算法对字符进行筛选时要对已挑出的不同类的字符做不同的标记,以免发生混淆

  • 但对于所有字符都相同的情况上述方法不太适用,则可以先判断是否为此类情况,若为真,则直接由公式计算得出结果。

猜你喜欢

转载自blog.csdn.net/qq_30479517/article/details/106976893