4.10字母异位词分组 哈希表

我的方法(会tle)
import java.util.*;

class Solution {
public List<List> groupAnagrams(String[] strs) {
List<List> result = new ArrayList<>();//用来存放最终结果
List list2=new ArrayList<>();//用来存放单个字符串的字符
//把一个字符串每个字母都存放在一个临时的list2里面
for(String s : strs){
char[] chars = s.toCharArray();
Arrays.sort(chars);
//遍历哈希表,如果存在相同的字母组合,就把当前的字符串索引存放在对应的list里面
int i=0;
boolean flag=true;
for(List newlist: result){

            for(String str :newlist){
                char[] chars1 = str.toCharArray();
                Arrays.sort(chars1);
                    if(!Arrays.equals(chars, chars1)){
                        //代表这是一个新的字母组合
                        flag=false;

                    }
                    else{
                        flag=true;
                    }
                    if(flag){
                        result.get(i).add(s);
                        break;
                        //如果存在这样一个字母组合,就把当前的字符串索引存放在对应的list里面
                    }
                    break;
            }
            if(flag){break;}
            i++;
    }
        if(!flag||result.size()==0){
            result.add(new ArrayList<String>());
            result.get(result.size()-1).add(s);
        }
        list2.clear();
    }
    return result;
}

}
利用二层list和很多判断,把每个string依次存进不同的区域

ai的方法:
import java.util.*;

class Solution {
public List<List> groupAnagrams(String[] strs) {
// 用于存储排序后的字符串和对应的字母异位词组
Map<String, List> map = new HashMap<>();

    for (String str : strs) {
        // 将字符串转换为字符数组
        char[] charArray = str.toCharArray();
        // 对字符数组进行排序
        Arrays.sort(charArray);
        // 将排序后的字符数组转换为字符串
        String sortedStr = new String(charArray);

        // 如果排序后的字符串不在 map 中,创建一个新的列表
        map.computeIfAbsent(sortedStr, k -> new ArrayList<>()).add(str);
    }

    // 返回 map 中的所有值,即分组后的字母异位词组
    return new ArrayList<>(map.values());
}

}
学习到的点:
1.如何把一个列表进行初始化
List list=Arrays.asList(1,2,3);
2.最后返回的ArrayList不用在一开始新建,<>可看作会自动补全类型
3. map.computeIfAbsent(sortedStr, k -> new ArrayList<>()).add(str);
检查某个键(这里是sortedStr)是否存在,如果存在,方法直接返回key关联的ArrayList;如果不存在,则执行lambda表达式新建一个ArrayList
4. return new ArrayList<>(map.values());这里每一个map。values都是一个List,所以map.values构成一个双层列表

posted @ 2025-04-10 12:15  Toby0919  阅读(13)  评论(0)    收藏  举报