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;
	}

}

 

上一篇:java黑皮书课后习题7.14


下一篇:输出字母出现频率