LeetCode第49题 字母异位词分组

在这里插入图片描述

第一反应

先写一个函数,用于对比两个词是否为异位词
然后每拿到一个新的词,就依次和前面保存的答案数组中的每一个词对比,如果有相同的就放进去,如果没有就单独成组放进去。
效率不高,要执行n^2次那个对比词的函数

看看题解

题解给了一个不错的方案。只要计数每个字母出现的次数就行。如果两个词中字母出现的次数一样,就存放在同一个列表里。

提交通过

试了一下用内部类作为结构体的写法,提交通过了,但是时间和内存消耗都太大了

class Solution {
    public class WordAndArr{
        public int[] chArr;
        public List<String> words;
        public WordAndArr(int[] inp){
            chArr = inp;
            words = new ArrayList<>();
        }
        public boolean checkEquals(int[] inp){
            for(int i = 0 ; i < 26 ; i ++){
                if(chArr[i] != inp[i]){
                    return false;
                }
            }
            return true;
        }
        public void print(){
            System.out.println("----------");
            for(int i = 0 ; i < 26 ; i ++){
                if(chArr[i] != 0){
                    System.out.println("chArr[" + i + "] = " + chArr[i]);
                }
            }
            for(String value:words){
                System.out.print(value + "  ");
            }
            System.out.println();
        }
    }
    public List<List<String>> groupAnagrams(String[] strs) {
        List<List<String>> ans = new ArrayList<>();
        int ansIndex = 0;
        List<WordAndArr> save = new ArrayList<>();
        for(int i = 0 , len = strs.length; i < len ; i ++){
            int[] chArr = wordToArray(strs[i]);
            boolean isNew = true;
            for(WordAndArr struct:save){
                if(struct.checkEquals(chArr)){
                    struct.words.add(strs[i]);
                    struct.print();
                    isNew = false;
                    break;
                }
            }
            if(isNew){
                WordAndArr wordAndArr = new WordAndArr(chArr);
                wordAndArr.words.add(strs[i]);
                wordAndArr.print();
                save.add(wordAndArr);
                
            }
        }
        for(WordAndArr wordAndArr:save){
            ans.add(wordAndArr.words);
        }
        return ans;

        // return null;
    }
    public int[] wordToArray(String word){
        int[] chArr = new int[26];
        for(int i = 0,len = word.length() ; i < len ; i ++){
            chArr[word.charAt(i) - 'a'] ++;
        } 
        return chArr;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值