Ananagrams UVa 156 BY小黑

赛题:
在这里插入图片描述
题目大意
输入一些单词,要求程序返回出一些满足如下要求的单词:

  • 这个单词字母在忽略大小写的情况下,通过字母重排不可以组成输入里的其他单词。
  • 输出该单词时每个字母的大小写与输入时完全一致
  • 输出单词按照单词的字典序排列

小黑题解

  • 我们在判断每个单词是否满足条件前,可以现将每个单词进行标准化(先将每个字母统一转化成小写,然后使用冒泡排序对每个字符进行排序),之后用map存放(以标准化的字符串为key,以原字符串为value)
  • 使用可变长数组Vector中存储每个标准化后的字符串,然后统计Vector里每个字符串的个数,将只出现一次的字符串找出来,并存放到TreeSet中。
  • 将TreeSet中的字符串通过迭代器依次打印出来,即是按照字典序并满足要求的字符串。

小黑提示

  • 将字符串保存在TreeSet集合中,无论元素输入的顺序,输出时一定是按字典序输出的。
  • 有人质疑,也许会有两个标准化后相同的字符串,通过map存储时由于key相同,而导致存储缺失。其实结果的确如此,不过我们的目的是返回满足符合要求的字符串,如果key都与其他某个单词相同了,那么这个单词一定不符合题意。也就是说我们在通过标准化单词映射原单词的过程中,一定不会用到这个key,所以这个单词是否被存储,都不影响结果。

程序实现

package 例题;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.Vector;
public class Ananagrams {
	static Vector<String> vectors; //可变数组
	static Map<String,String> map;	//map映射
	static Set<String> set;	//set集合
	static Iterator<String> iterator;	//迭代器
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		vectors = new Vector<String>();
		map = new TreeMap<String,String>();
		System.out.println("请输入单词集合:");
		String str = sc.next();
		Set<String> set = new TreeSet<String>();	//初始化TreeSet集合
		while(!str.equals("#")){	//输入单词过程
			String s = str.toLowerCase();	//统一转化为小写
			char[] arr = s.toCharArray();	//将字符串转化为字符数组
			sort(arr); 	//冒泡排序
			String value = new String(arr);	//返回标准化后的字符串
			map.put(value, str);	//生成键值对<标准化单词,原单词>
			vectors.add(value);	 //将标准化单词加入vectors中
			str = sc.next();
		}
		int length = vectors.size();
		for (int i = 0; i < length; i++) {	//判断每个标准化单词出现的个数,保留至出现一次的单词
			boolean f = true;
			String a = vectors.get(i);
			for (int j = 0; j < length; j++) {
				if(vectors.get(j).equals(a) && j != i){
					f = false;
					break;
				}
			}
			if(f){
				set.add(map.get(a));	//找到了,通过映射得到原单词,并放入TreeSet中
			}
		}
		iterator = set.iterator();	//生成迭代器,并迭代输出
		while(iterator.hasNext()){
			System.out.println(iterator.next());
		}
		sc.close();
	}
	public static void sort(char[] arr){	//冒泡排序过程
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length - 1 - i; j++) {
				if(arr[j]>arr[j+1]){
					char temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
	}
}

结果
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值