一、《用杂志拼接信件》
1、案例要求
影视剧中信件大多是从报纸或杂志上的字符剪下来拼接而成的。
杂志和信件均由字符串构成,对于给定的杂志和信件,确定信件是否可以由杂志上的字符构成。
例如杂志为 ab,信件为 aa,则不能构成。杂志为 aab,信件为 aa,则可以构成。
2、输入描述
输入两行字符串,长度均不超过 100。
第一行为杂志字符串,第二行为信件字符串。
3、输出描述
输出一行,若信件可由杂志构成则输出 YES,否则输出 NO。
如:
第一行输入ab,第二行输入aa,则输出NO
4、个人学习前挫折,学习后的分析与思路
1、挫折
首先,观察到输入的杂志与信件之间有包含与被包含关系,则可以利用字符串相关方法.contain( )判断,若信件包含于杂志中,则返回YES,反则返回NO
import java.util.Scanner;
public class 杂志拼接信件 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String a=sc.next();
String b=sc.next();
if (a.contains(b)){
System.out.println("YES");
}else {
System.out.println("NO");
}
}
}
问题:实际上杂志中的所有数据,字母都是分开零散的,没有考虑到顺序问题
2、学习后的分析与思路
首先输入的数据都是英文,则可以创建一个数组,26个格子分别存储输入杂志数据的每个英文字母出现的次数,然后统计输入信件字母的出现次数,并与数组中存储的数值相减,若无出现负数则返回YES,反之则返回NO
import java.util.Scanner;
public class 杂志拼接信件 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String a = sc.next();
String b = sc.next();
int[] num = new int[26]; //创建26个格子,每个格子存放对应字母出现次数(如第一个格子<0>代表的a出现次数)
for (int i = 0; i < a.length(); i++) { //统计输入字符串a中每个字母出现次数存入到数组num中
num[a.charAt(i) - 'a']++; //利用charArt方法访问字符串中的每一个字母的值减去字母a的值得到数组num中26个字母对应的位置的下标,并在此单元格加1
}
for (int i = 0; i < b.length(); i++) { //统计输入字符串b中每个字母出现次数在数组num对应字母位置中减去该字母出现次数
num[b.charAt(i) - 'a']--; //利用charArt方法访问字符串中的每一个字母的值减去字母a的值得到数组num中26个字母对应的位置的下标,并在此单元格减1
if (num[b.charAt(i) - 'a'] < 0) { //如果num数组中出现负数,则返回NO,结束
System.out.println("NO");
return;
}
}
System.out.println("YES"); //若一切正常则说明该杂志可以拼接成信件,返回YES
}
}
3、个人收获
遇到两组数据的操作,不能急于求成,需要仔细分析案例和题目要求,最好是对两组数据一 一对应操作,避免出现差错
这个案例很好的让我熟悉了字符串与数组方法的相关操作,掌握简单的数据拆分方法