LintCode 乱序字符串

题目

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

注意事项

所有的字符串都只包含小写字母

样例
对于字符串数组 ["lint","intl","inlt","code"]

返回 ["lint","inlt","intl"]

分析

通过hash的思想,我们就是要计算出一个字符串出现的字符以及每个字符出现的次数,如果一样,则说明,两个字符就是Anagram。我们可以写一个hash函数,将每个字符串转换成字母加数字的形式。
比如,lintt,的hash就是i1l1n1t2,这样就可以判断两个字符是不是Anagram。
再利用hashmap的特性,我们很容易实现这个算法,具体看代码

代码

public class Solution {
    /**
     * @param strs: A list of strings
     * @return: A list of strings
     */
  public ArrayList<String> anagrams(String[] strs) {
        HashMap<String,ArrayList<String>> hash = new HashMap<>();
        
        for(String str : strs) {
            // create unique label for each string
            String key = generalLabel(str);
            // map the label to a list of anagrams
            if(!hash.containsKey(key)) {
                ArrayList<String> temp = new ArrayList<>(); 
                hash.put(key, temp);
                temp.add(str);
            }
            else {
                hash.get(key).add(str);
            }
        }
        
        ArrayList<String> res = new ArrayList<>();
        
        for(ArrayList<String> anagram : hash.values()) {
             // ignore strings without anagrams
            if(anagram.size() > 1)
                res.addAll(anagram);
        }
        
        return res;
    }
    /*  
     * create a unique label for a string  
     * "cat", "atc" => a1c1t1  
     */  
    private String generalLabel(String str) {
        int[] hash = new int[26];
        for(int i=0;i<str.length();i++) {
            int idx = (int)(str.charAt(i)-'a');
            hash[idx]++;
        }
        
        StringBuilder sb = new StringBuilder();
        
        for(int i=0;i<26;i++) {
            if(hash[i] == 0)
                continue;
            char c = (char)('a' + i);
            sb.append(c);
            sb.append(hash[i]);
        }
        return sb.toString();
    }
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 今天做了一道中等难度的字符串题目,这道题目花了我两个小时,不过也做了不少的思考,写篇日志记录一下我的思考过程。 首...
    HarperKoo阅读 4,196评论 7赞 6
  • 问题描述如下:给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他...
    爱秋刀鱼的猫阅读 483评论 1赞 1
  • 版权声明:本文为博主原创文章,未经博主允许不得转载。 难度:中等 要求: 给出一个字符串数组S,找到其中所有的乱序...
    柒黍阅读 498评论 0赞 0
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,811评论 0赞 4
  • 古典专栏《20-2价值链分析法,不盯职位盯行业》读后反思 昨天听完古典老师的直播后,反思一下觉得还是调整自己的学习...
    丹丹自语阅读 289评论 0赞 0

友情链接更多精彩内容