LeetCode - Anagrams

本文介绍了一种高效算法,用于从字符串数组中找出所有的异位词组。通过将每个字符串排序后作为键值,可以快速识别并归类异位词,有效避免了传统两两比较的高时间复杂度。

https://leetcode.com/problems/anagrams/

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

Note: All inputs will be in lower-case.

两种方法,一种方法是判断两个string是不是anagram,见下面注释掉的代码,然后如果是,就把这两个string加入到结果List中,然后把这两位标识成已访问(如把当前)

public List<String> anagrams(String[] strs){
        List<String> rst = new ArrayList<String>();
        if(strs==null || strs.length==0) return rst;
        
        for(int i=0; i<strs.length; i++){
            if(strs[i].equals("")) continue;
            boolean hasAnagram = false;
            for(int j= i+1; j<strs.length; j++){
                if(strs[j].equals("")) continue;
                if(isAnagram(strs[i], strs[j])){
                    rst.add(strs[j]);
                    strs[j] = "";
                    hasAnagram = true;
                }
            }
            if(hasAnagram){
                rst.add(strs[i]);
                strs[i] = "";
            } 
        }
        return rst;
    }
    
    public boolean isAnagram(String s1, String s2){
        if(s1 == null || s2 == null) return false;
        if(s1.length() != s2.length()) return false;
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        for(int i=0; i<s1.length(); i++){
            if(map.containsKey(s1.charAt(i))){
                map.put(s1.charAt(i), map.get(s1.charAt(i))+1);
            }
            else{
                map.put(s1.charAt(i), 1);
            }
        }
        for(int i=0; i<s2.length(); i++){
            if(map.containsKey(s2.charAt(i))){
                int num = map.get(s2.charAt(i));
                num--;
                if(num<0) return false;
                map.put(s2.charAt(i), num);
            }
            else return false;
        }
        return true;
    }


但是这种方法超时了,因为虽然判断两个字符串是否anagram比排序要快,时间复杂度O(n),但对于数组长度n来说,时间复杂度是O(n^2)


一是把所有string都排序,然后把排序后的结果作为Key,string本身作为arraylist的元素加入到hashtable中去。

public List<String> anagrams(String[] strs) {
        List<String> rst = new ArrayList<String>();
        if(strs==null || strs.length==0) return rst;
        
        HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
        
        for(int i=0; i<strs.length; i++){
            char[] str = strs[i].toCharArray();
            Arrays.sort(str);
            String sorted = new String(str);
            if(map.containsKey(sorted)){
                map.get(sorted).add(strs[i]);
            }
            else{
                ArrayList<String> tmp = new ArrayList<String>();
                tmp.add(strs[i]);
                map.put(sorted, tmp);
            }
        }
        for(ArrayList<String> list : map.values()){
            if(list.size()>1) rst.addAll(list);
        }
        return rst;
    }

这种方法虽然要排序,但是对于本身比较小的string来说,O(nlgn)不会太大,而且对于数组长度n来说,时间复杂度是O(n),因此这种方法更快一些。

面试的时候要认真分析到底哪种方法比较快,再写,不要想当然地觉得排序就比较慢。

当前,全球经济格局深刻调整,数字化浪潮席卷各行各业,智能物流作为现代物流发展的必然趋势和关键支撑,正迎来前所未有的发展机遇。以人工智能、物联网、大数据、云计算、区块链等前沿信息技术的快速迭代与深度融合为驱动,智能物流不再是传统物流的简单技术叠加,而是正在经历一场从自动化向智能化、从被动响应向主动预测、从信息孤岛向全面互联的深刻变革。展望2025年,智能物流系统将不再局限于提升效率、降低成本的基本目标,而是要构建一个感知更全面、决策更精准、执行更高效、协同更顺畅的智慧运行体系。这要求我们必须超越传统思维定式,以系统化、前瞻性的视角,全面规划和实施智能物流系统的建设。本实施方案正是基于对行业发展趋势的深刻洞察和对未来需求的精准把握而制定。我们的核心目标在于:通过构建一个集成了先进感知技术、大数据分析引擎、智能决策算法和高效协同平台的综合智能物流系统,实现物流全链路的可视化、透明化和智能化管理。这不仅是技术层面的革新,更是管理模式和服务能力的全面提升。本方案旨在明确系统建设的战略方向、关键任务、技术路径和实施步骤,确保通过系统化部署,有效应对日益复杂的供应链环境,提升整体物流韧性,优化资源配置效率,降低运营成本,并最终为客户创造更卓越的价值体验。我们致力于通过本方案的实施,引领智能物流迈向更高水平,为构建现代化经济体系、推动高质量发展提供强有力的物流保障。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值