题目来源:A Great Alchemist

A Great Alchemist


Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB

Problem

Carol is a great alchemist.

In her world, each metal has a name of 2N (N is an integer) letters long, which consists of uppercase alphabets.

Carol can create metal S3 from S1 and S2 alchemical when she can make the name of S3 by taking N letters each from S1 and S2then rearranging them properly.

You are given 3 names of the metal S1S2S3. Determine wether Carol can create S3 from S1 and S2 or not.


Input

The input will be given in the following format from the Standard Input.

S1
S2
S3
  • On the first line, you will be given the name of the first metal material S1.
  • On the second line, you will be given the name of the second metal material S2.
  • On the third line, you will be given the name of the metal S3, which Carol wants to create.
  • Each character in the S1S2, and S3 will be an uppercase English alphabet letter.
  • Each string S1S2 and S3 has same number of letters and the number is always even.
  • It is guaranteed that 2≦|S1|≦105

Output

If Carol can create S3 from S1 and S2, output YES, if not, output NO in one line. Make sure to insert a line break at the end of the output.


Input Example 1

  1. AABCCD
  2. ABEDDA
  3. EDDAAA

Output Example 1

  1. YES

You can make EDDAAA by picking AAD from the first metal, and AED from the second metal.


Input Example 2

  1. AAAAAB
  2. CCCCCB
  3. AAABCB

Output Example 2

  1. NO

To make AAABCB, you have to take at least four letters from the first material. So this can't be created alchemical.

题目比较简单,我就不翻译了。

解题思路:此题只能用回溯法来做,但是有很多地方是可以剪枝的,去掉一些不必要的操作。

1、首先统计s1、s2、s3中字母'A-Z'的个数,存放在array1、array2和array3中;

2、剪枝:1)如果array1[i]+array2[i]<array3[i],直接输出NO;

2)commonS1S3为Math.min(array1[i],array3[i]) (i=0,1,...,n-1) 求和,

commonS2S3为Math.min(array2[i],array3[i]) (i=0,1,...,n-1) 求和,

如果commonS1S3和commonS2S3分别小于n/2,直接输出NO。

3、试探回溯

具体算法(java版,直接AC)

 import java.util.Scanner;

 public class Main {

     private static final int letterCount = 26;

     public static boolean track(String s3, int[] array1, int[] array2,
int count1, int count2, int curIndex) {
if (curIndex >= s3.length()) //全部试探结束
return true;
int index = s3.charAt(curIndex) - 'A'; //curIndex所对应的下标 //如果array1[index]中没有需要的元素,同时count1(在s1中已经用掉的字符个数)小于n/2
if (array1[index] > 0 && count1 <= s3.length() / 2) {
array1[index]--; //用掉s1中一个字符
if (track(s3, array1, array2, count1 + 1, count2, curIndex + 1))
return true;
array1[index]++; //回溯
}
if (array2[index] > 0 && count2 <= s3.length() / 2) {
array2[index]--;
if (track(s3, array1, array2, count1, count2 + 1, curIndex + 1))
return true;
array2[index]++;
}
return false;
} public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s1 = scanner.next();
String s2 = scanner.next();
String s3 = scanner.next();
int[] array1 = new int[letterCount];
int[] array2 = new int[letterCount];
int[] array3 = new int[letterCount];
for (int i = 0; i < s1.length(); i++) {
array1[s1.charAt(i) - 'A']++;
array2[s2.charAt(i) - 'A']++;
array3[s3.charAt(i) - 'A']++;
}
boolean flag = true;
int commonS1S3 = 0;
int commonS2S3 = 0;
for (int i = 0; i < letterCount; i++) {
if (array3[i] > array1[i] + array2[i]) {
flag = false;
break;
}
commonS1S3 += Math.min(array1[i], array3[i]);
commonS2S3 += Math.min(array2[i], array3[i]);
}
if (commonS1S3 < s1.length() / 2 || commonS2S3 < s1.length() / 2) {
flag = false;
}
if (flag) {
flag = track(s3, array1, array2, 0, 0, 0);
}
if (flag) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}

A Great Alchemist 最详细的解题报告的更多相关文章

  1. hihoCoder 1114 小Hi小Ho的惊天大作战:扫雷·一 最详细的解题报告

    题目来源:小Hi小Ho的惊天大作战:扫雷·一 解题思路:因为只要确定了第一个是否有地雷就可以推算出后面是否有地雷(要么为0,要么为1,如果不是这两个值就说明这个方案行不通),如果两种可能中有一种成功, ...

  2. hihoCoder 1050 树中的最长路 最详细的解题报告

    题目来源:树中的最长路 解题思路:枚举每一个点作为转折点t,求出以t为根节点的子树中的‘最长路’以及与‘最长路’不重合的‘次长路’,用这两条路的长度之和去更新答案,最终的答案就是这棵树的最长路长度.只 ...

  3. hihoCoder 1052 基因工程 最详细的解题报告

    题目来源:基因工程 解题思路:假设基因序列长度为N,则需要计算基因序列前K个和后K个相同所需要的最少改变次数sum. 假设基因序列为 ATACGTCT (即M=8),K=6:interval=M-K= ...

  4. hihoCoder 1051 补提交卡 最详细的解题报告

    题目来源:补提交卡 解题思路:假设未提交程序的天数为:a1,a2,....,an,补交的张数为M.依次从a1,a2,....,an中去掉连续的 K 天(0<=K<=M),然后再来计算剩余数 ...

  5. hihoCoder 1049 后序遍历 最详细的解题报告

    题目来源:后序遍历 解题思路:开始时我只知道先通过先序.中序求出二叉树,然后再后序遍历二叉树,这当然也是一种解题思路,但是会做一些无用功,比如:计算二叉树.其实,可以直接通过先序序列和中序序列直接求出 ...

  6. hihoCoder 1041 国庆出游 最详细的解题报告

    题目来源:国庆出游 解题思路(下面是大神的写的): 把题目中的序列称作S,树称作T.那么对于S中的任意节点x,x的子孙节点如果在S出现的话,那么这个子孙节点的位置是有一定要求的:x的所有子孙节点在S中 ...

  7. A Broken Calculator 最详细的解题报告

    题目来源:A Broken Calculator 题目如下(链接有可能无法访问): A Broken Calculator Time limit : 2sec / Stack limit : 256M ...

  8. A Mountaineer 最详细的解题报告

    题目来源:A Mountaineer (不知道该链接是否可以直接访问,所以将题目复制下来了) 题目如下: D - A Mountaineer Time limit : 2sec / Stack lim ...

  9. hihoCoder 1040 矩阵判断 最详细的解题报告

    题目来源:矩阵判断 解题思路: 1.判断矩阵的4个点是否相连,一共输入8个点,只要判断是否4个点是否都经过2遍: 2.判断矩阵中任意一条边与其他边之间要么平行,要么垂直.设A(x1,y1),B(x2, ...

随机推荐

  1. 从字符串到常量池,一文看懂String类设计

    从一道面试题开始 看到这个标题,你肯定以为我又要讲这道面试题了 // 这行代码创建了几个对象? String s3 = new String("1"); 是的,没错,我确实要从这里 ...

  2. Nginx配置rewrite过程介绍

    创建rewrite语句 vi conf/vhost/www.abc.com.conf #vi编辑虚拟主机配置文件 文件内容 server { listen 80; server_name abc.co ...

  3. 解决错误 CS1617 Invalid option '7.1' for /langversion; must be ISO-1, ISO-2, Default or an integer in range 1 to 6.

    解决错误 CS1617 Invalid option '7.1' for /langversion; must be ISO-1, ISO-2, Default or an integer in ra ...

  4. 7.kubernetes集群版本升级

    1.查看原集群的Node节点的版本号 [root@hdss7-22 opt]# kubectl get node -o wide 2.将要升级的kubernetes版本上传到node节点上并解压(v1 ...

  5. Spring Boot入门系列(十五)Spring Boot 开发环境热部署

    在实际的项目开发过中,当我们修改了某个java类文件时,需要手动重新编译.然后重新启动程序的,整个过程比较麻烦,特别是项目启动慢的时候,更是影响开发效率.其实Spring Boot的项目碰到这种情况, ...

  6. 在Java虚拟机上班是一种怎样的体验?

    228 人赞同了该回答 利益相关,匿了! JVM公司里面线程众多,派系林立,尤其是执行引擎那波人,因为是核心部门,经常diss别的部门. 428 人赞同了该回答 不请自来. 其实在JVM工作没有你们想 ...

  7. junit配合catubuter统计单元测试的代码覆盖率

    1.视频参考孔浩老师ant视频笔记 对应的build-junit.xml脚步如下所示: <?xml version="1.0" encoding="UTF-8&qu ...

  8. xdebug调试代码常用操作

    xdebug调试代码常用操作 1.查看变量中的值 2.常用快捷键 ①F8单步调试 ②F9可以直接快速结束调试 ③F7 可以进入调试代码的底层方法,我觉得查看底层代码时,这个特别的方便!

  9. Python3-paramiko模块-基于SSH的远程连接模块

    Python3中的paramiko模块,基于SSH用于连接远程服务器并执行相关操作 http://docs.paramiko.org/en/2.1/ SSHClient 用于连接远程服务器并执行基本命 ...

  10. 最新的一波Vue实战技巧,不用则已,一用惊人

    在Vue中,不同的选项有不同的合并策略,比如 data,props,methods是同名属性覆盖合并,其他直接合并,而生命周期钩子函数则是将同名的函数放到一个数组中,在调用的时候依次调用 在Vue中, ...