lintcode:乱序字符串

描述:

给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。

实现:

public class Solution {
    /**
     * @param strs: A list of strings
     * @return: A list of strings
     */
    public List<String> anagrams(String[] strs) {
        List<String> result=new ArrayList<>();
        if(strs==null || strs.length==0){
        	return result;
        }       
        HashMap<String, String> h=new HashMap<>();
        for(int i=0; i<strs.length; i++){
        	String st=mySort(strs[i]);
        	if(h.get(st)!=null){
        		result.add(strs[i]);
        		h.put(st, h.get(st).replace("0", "1"));
        	}
        	else{
        		h.put(st, strs[i]+"0");
        	}
        }
        for(String st: h.keySet()){
        	String t=h.get(st);
        	if(t.charAt(t.length()-1)=='1'){
        		result.add(t.substring(0, t.length()-1));
        	}
        }
        return result;
    }
	
	private String mySort(String str){
		if(str==null || str=="") return str;
		char[] c=str.toCharArray();
		Arrays.sort(c);
		StringBuilder sb=new StringBuilder();
		for(int i=0; i<c.length; i++){
			sb.append(c[i]);
		}
		return sb.toString();
	}
}

个人感觉这个题目,lintcode给出的测试用例有点问题,因为按照题干中给出的乱序字符串的定义(字符集相同但顺序不同),两个相同的字符串不是乱序字符串,比如字符串数组["abc","abc","bcd","dcb"],最后应该只输出["bcd","dcb"],但是lintcode的测试用例里面把"abc"也作为乱序字符串了。上面的代码是能够完成这个功能的,下面在此基础上修改的代码可以消除这个情况:

public class Anagrams {
	public List<String> anagrams(String[] strs) {
        List<String> result=new ArrayList<>();
        if(strs==null || strs.length==0){
        	return result;
        }
        boolean flag=false;
        Set<String> s=new HashSet<>();//消除相同的字符串
        HashMap<String, Integer> hCount=new HashMap<>();//记录相同的字符串出现的次数
        for(int i=0; i<strs.length; i++){
        	if(flag && strs[i].length()==0){
        		result.add("");
        	}
        	if(strs[i].length()==0){
        		flag=true;        		
        	}
        	if(hCount.get(strs[i])!=null){
        		hCount.put(strs[i], hCount.get(strs[i])+1);
        	}
        	else{
        		hCount.put(strs[i], 1);
        	}
        	s.add(strs[i]);
        }
        if(flag){
        	result.add("");
        }
        HashMap<String, String> h=new HashMap<>();
        for(String str: s){
        	String st=mySort(str);
        	if(h.get(st)!=null){
        		for(int i=0; i<hCount.get(str); i++){
        			result.add(str);
        		}
        		h.put(st, h.get(st).replace("0", "1"));
        	}
        	else{
        		h.put(st, str+"0");
        	}
        }
        for(String st: h.keySet()){
        	String t=h.get(st);
        	if(t.charAt(t.length()-1)=='1'){
        		for(int i=0; i<hCount.get(t.substring(0, t.length()-1)); i++){
        			result.add(t.substring(0, t.length()-1));
        		}
        	}
        }
        return result;
    }
	
	private String mySort(String str){
		char[] c=str.toCharArray();
		Arrays.sort(c);
		StringBuilder sb=new StringBuilder();
		for(int i=0; i<c.length; i++){
			sb.append(c[i]);
		}
		return sb.toString();
	}

}

测试了几个样例,对于["abc","abc","bcd","dcb","bcd"],输出["dcb", "bcd", "bcd"],能够过滤掉重复的非乱序字符串,但是不会过滤掉重复的乱序字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值