Leetcode 2157 字符串分组

 

广度搜索+哈希表+状态转换

 

贴代码:

 

import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Queue;

class Solution {
    Map<Integer, Integer> map = new HashMap<>();
    HashSet<Integer> set = new HashSet<>();

    public int[] groupStrings(String[] words) {
        int n = words.length;

        // 转换
        for (int i = 0; i < n; i++) {
            String s = words[i];
            int mark = 0;
            for (int j = 0, len = s.length(); j < len; j++) {
                int v = s.charAt(j) - 'a';
                mark += (1 << v);
            }
            Integer v = map.get(mark);
            if (v == null) {
                map.put(mark, 1);
            } else {
                map.put(mark, v + 1);
            }
        }

        // bfs;
        int max = 0;
        int total = 0;

        for (Entry<Integer, Integer> entry : map.entrySet()) {
            int u = entry.getKey();

            if (set.contains(u)) {
                continue;
            }
            total++;
            // 0 变 1
            // 1 变 0
            // 替换. count0,count1,
            int num = bfs(u);
            if (num > max) {
                max = num;
            }
        }
        return new int[] { total, max };
    }

    public int bfs(int root) {
        int cnt = map.get(root);
        Queue<Integer> queue = new LinkedList<>();
        queue.add(root);
        set.add(root);

        while (!queue.isEmpty()) {
            int u = queue.poll();

            // add;
            for (int i = 0; i < 26; i++) {
                if ((u & (1 << i)) == 0) {
                    int v = u + (1 << i);

                    Integer num = map.get(v);

                    if (num == null) {
                        continue;
                    }

                    if (set.contains(v)) {
                        continue;
                    }

                    queue.add(v);
                    set.add(v);
                    cnt += num;
                }
            }
            // delete;
            for (int i = 0; i < 26; i++) {
                if ((u & (1 << i)) > 0) {
                    int v = u - (1 << i);

                    Integer num = map.get(v);
                    if (num == null) {
                        continue;

                    }

                    if (set.contains(v)) {
                        continue;
                    }

                    queue.add(v);
                    set.add(v);
                    cnt += num;

                }
            }
            // transfer;
            for (int i = 0; i < 26; i++) {
                if ((u & (1 << i)) > 0) {
                    for (int j = 0; j < 26; j++) {
                        if( (u & (1<<j)) == 0){
                            int v = u - (1<<i) + (1<<j);
                            
                            Integer num = map.get(v);
                            if(num == null){
                                continue;
                            }
                            
                            if( set.contains(v)){
                                continue;
                            }
                            
                            queue.add(v);
                            set.add(v);
                            cnt += num;
                        }
                    }
                }
            }
        }

        return cnt;
    }

}

 

posted @ 2022-02-04 19:24  fishcanfly  阅读(43)  评论(0)    收藏  举报
//雪花飘落效果