算法训练 Anagrams问题

  • 问题描述

    Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的。例如,“Unclear”和“Nuclear”、“Rimon”和“MinOR”都是Anagrams。编写一个程序,输入两个单词,然后判断一下,这两个单词是否是Anagrams。每一个单词的长度不会超过80个字符,而且是大小写无关的。
      
      输入格式:输入有两行,分别为两个单词。
      输出格式:输出只有一个字母Y或N,分别表示Yes和No。
      输入输出样例

  • 样例输入

     Unclear
     Nuclear
    
  • 样例输出

     Y
    
  • 解题思路
    本题主要考察单词计数问题,通过比较单词出现的次数来判断是否符合题目定义Anagrams。首先将两个字符串转换为小写(或者大写),方便后面比较,比较函数里用switch循环判断每个单词出现了多少次,最后通过比较出现的次数是否相同来输出Y,N。
    注意:比较函数比较26个英文字母比较麻烦,因此需要细心,我用的是一种通俗易懂的方法,但是代码观赏性不好,如果各位大佬有更好的方法欢迎在下方评论里指正。
    代码如下:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String vocabulary1 = sc.next();
		String vocabulary2 = sc.next();
		//将两个字符串转换为小写
		vocabulary1=vocabulary1.toLowerCase();
		vocabulary2=vocabulary2.toLowerCase();
		compare(vocabulary1,vocabulary2);
	}

	private static void compare(String vocabulary1, String vocabulary2) {
		// 比较两个单词是否Anagrams
		boolean flag = true;
		int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;
		int a1=0,b1=0,c1=0,d1=0,e1=0,f1=0,g1=0,h1=0,i1=0,j1=0,k1=0,l1=0,m1=0,n1=0,o1=0,p1=0,q1=0,r1=0,s1=0,t1=0,u1=0,v1=0,w1=0,x1=0,y1=0,z1=0;
		if(vocabulary1.length()!=vocabulary2.length()){
			flag=false;
		}else{
		//计算第一个单词每个字母出现了多少次
			for (int index = 0; index < vocabulary1.length(); index++) {
				switch(vocabulary1.charAt(index)){
				case 'a': a++;break;
				case 'b': b++;break;
				case 'c': c++;break;
				case 'd': d++;break;
				case 'e': e++;break;
				case 'f': f++;break;
				case 'g': g++;break;
				case 'h': h++;break;
				case 'i': i++;break;
				case 'j': j++;break;
				case 'k': k++;break;
				case 'l': l++;break;
				case 'm': m++;break;
				case 'n': n++;break;
				case 'o': o++;break;
				case 'p': p++;break;
				case 'q': q++;break;
				case 'r': r++;break;
				case 's': s++;break;
				case 't': t++;break;
				case 'u': u++;break;
				case 'v': v++;break;
				case 'w': w++;break;
				case 'x': x++;break;
				case 'y': y++;break;
				case 'z': z++;break;
				}
			}
			//计算第二个单词每个字母出现了多少次
			for (int index = 0; index < vocabulary2.length(); index++) {
				switch(vocabulary2.charAt(index)){
				case 'a': a1++;break;
				case 'b': b1++;break;
				case 'c': c1++;break;
				case 'd': d1++;break;
				case 'e': e1++;break;
				case 'f': f1++;break;
				case 'g': g1++;break;
				case 'h': h1++;break;
				case 'i': i1++;break;
				case 'j': j1++;break;
				case 'k': k1++;break;
				case 'l': l1++;break;
				case 'm': m1++;break;
				case 'n': n1++;break;
				case 'o': o1++;break;
				case 'p': p1++;break;
				case 'q': q1++;break;
				case 'r': r1++;break;
				case 's': s1++;break;
				case 't': t1++;break;
				case 'u': u1++;break;
				case 'v': v1++;break;
				case 'w': w1++;break;
				case 'x': x1++;break;
				case 'y': y1++;break;
				case 'z': z1++;break;
				}
			}
			//比较两个单词字母出现个数是否相同
			if(a==a1&&b==b1&&c==c1&&d==d1&&e==e1&&f==f1&&g==g1
					&&h==h1&&i==i1&&j==j1&&k==k1&&l==l1&&m==m1
					&&n==n1&&o==o1&&p==p1&&q==q1&&r==r1&&s==s1
					&&t==t1&&u==u1&&v==v1&&w==w1&&x==x1&&y==y1&&z==z1){
					flag=true;	
			}else{
				flag=false;
			}
		}
		if(flag){
			System.out.println("Y");
		}else{
			System.out.println("N");
		}
	}

}

6

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值