阿里云【7天实践训练营】进阶路线——Day6:在线编程题目-106.Jerry的考验

高校计划简介
为响应“新基建,新人才”号召,阿里云推出高校计划,向全国高校学生、教师免费提供2.68亿小时云服务器ECS算力,及“学练赛考”技术成长赋能体系。 陪伴两千多所高校的在校生云上实践、云上成长。点击高校计划立即申请。

在这里插入图片描述
我在阿里云高校计划参加了ECS训练营进阶班,赠送了价值600元的阿里云大数据助理工程师认证(ACA),希望大家感兴趣的话也来报名训练营,让我们一起当校友吧。

106.Jerry的考验

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

输入:一个正整数n,一个长度为2*n的字符串。
输出:方案数。

示例
输入:
2
"abba"
输出:
4

解题思路描述

点击查看:笔试算法模拟题精解之“Jerry的考验”
本题的关键在于理解题意:所谓挑选n个字符变成a和b两个字符串,是指在原字符串中抽出n个字符,这些字符的的顺序保持不变,剩下字符的顺序也保持不变,由此组成a和b两个字符串。

例如 "abcdef",挑选第2、3、5个字符,则分成 "bce" 和 "adf" 两个串。

接下来是整理的思路解析:整体框架是dfs,枚举每个字符属于a还是属于b,搜索过程中需要利用a和b的对称性做加速处理,否则会超时

比方说:
xcccddcccxdd

从左往右枚举a字符串的构成,如果令第一个x属于a,根据对称性,倒数第三个字符x一定是属于b;如此推导出末尾的dd一定属于a,中间位置的dd一定属于b,而且是b的头两个字符;然后左边ccc一定a,右边ccc一定是b,由此得出1种方案。令第一个x属于b也可以用同样的方式得到1种方案。

用这个思路直接写代码不太好写,可以通过枚举二进制,固定左半边的选择情况,然后对于每一个case,通过dfs搜索右半边有多少种合法组合,搜索过程中利用对称性进行剪枝。

对于字符全部相同case如"aaaaaaaa",因为过程中无法剪枝,会退化成2^(2*n)。对于这种case,答案就是 C(2n,n) ,预判一下直接返回即可。

分析

初始字符串 a1 b1 b2 a2
方案1 a1 b1 b2 a2
方案2 a1 b2 b1 a2
方案3 b1 a1 a2 b2
方案4 b2 a1 a2 b1

可以看出,对于字符串abba分成两个等长的字符串a和b,并且a和反转后的b相同,一共有四种方案。

源码:
功能实现但是超时,不献丑了,我是five。
在这里插入图片描述

你可能感兴趣的:(阿里云ecs)