Anagrams

Given an array of strings, return all groups of strings that are anagrams.

Note: All inputs will be in lower-case.

题目要求将给定字符串数组中有着相同字母构成的列出来

首先试了下依次比较  复杂度为O(N^2)提交时超时了 代码如下:

public static List<String> anagrams(String[] strs) {
			List<String> res=new ArrayList<String>();
			Map<Integer,Integer> hm=new HashMap<Integer,Integer>();
			for(int i=0;i<strs.length-1;i++){
				if(hm.containsKey(strs[i])) continue;
				int flag=0;
				for(int j=i+1;j<strs.length;j++){
					if(hm.containsKey(strs[j])) continue;
					
					if(compare(strs[i], strs[j])){
						if(flag==0){
							res.add(strs[i]);
							res.add(strs[j]);
						}else{
							res.add(strs[j]);
						}
					}
					hm.put(j, 1);
					flag=1;
				}
			}
			return res;
	}
	public static boolean compare(String s1,String s2){
		
		if(s1.length()!=s2.length()) return false;
		Map<Character,Integer> hm=new HashMap<Character,Integer>();
		for(int i=0;i<s2.length();i++){
			if(hm.containsKey(s2.charAt(i))){
				hm.put( s2.charAt(i), hm.get(s2.charAt(i))+1);
			}else{
				hm.put(s2.charAt(i), 1);
			}
		}
		for(int i=0;i<s1.length();i++){
			if(hm.containsKey(s1.charAt(i))){
				if(hm.get(s1.charAt(i))==1){
					hm.remove(s1.charAt(i));
				}else{
					hm.put(s1.charAt(i), hm.get(s1.charAt(i))-1);
				}
			}else{
			    return false;
			}
		}
		return true;
	}

随后想了一下 相同字母的不通结构如果排好序 其内容是一样的 而排序的复杂度并不高 所以 将每个字母进行排序 将排序后的字符串作为哈希表的KEY值进行存储 最后 只要确认KEY对应的VALUE是否含有两个以上的字符串 复杂度仅为O(N) 代码如下:

public static List<String> anagrams(String[] strs) {
		if(strs==null||strs.length<2)return new ArrayList<>();
		List<String> res=new ArrayList<String>();
		Map<String,List<String>> hm=new HashMap<String,List<String>>();
		for(String s:strs){
			String sorted=sort(s);
			if(hm.containsKey(sorted)){
				List<String> ls=new ArrayList<String>();
				ls=hm.get(sorted);
				ls.add(s);
				hm.put(sorted, ls);			
			}else{
				List<String> ls=new ArrayList<String>();
				ls.add(s);
				hm.put(sorted, ls);
			}
		}
		for(String key:hm.keySet()){
			if(hm.get(key).size()>1){
				res.addAll(hm.get(key));
			}
		}
		return res;
	}
	public static String sort(String s){
		char[] ch=s.toCharArray();
		Arrays.sort(ch);
		return String.valueOf(ch);
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值