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;
} }
Leetcode 2157 字符串分组的更多相关文章
- Leetcode中字符串总结
本文是个人对LeetCode中字符串类型题目的总结,纯属个人感悟,若有不妥的地方,欢迎指出. 一.有关数字 1.数转换 题Interger to roman和Roman to integer这两题是罗 ...
- LeetCode:字符串的排列【567】
LeetCode:字符串的排列[567] 题目描述 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: ...
- 前端与算法 leetcode 8. 字符串转换整数 (atoi)
目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...
- 前端与算法 leetcode 387. 字符串中的第一个唯一字符
目录 # 前端与算法 leetcode 387. 字符串中的第一个唯一字符 题目描述 概要 提示 解析 解法一:双循环 解法二:Set法单循环 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...
- LeetCode:字符串相加【415】
LeetCode:字符串相加[415] 题目描述 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100.num1 和num2 都只 ...
- LeetCode 49 Group Anagrams(字符串分组)
题目链接: https://leetcode.com/problems/anagrams/?tab=Description Problem:给一个字符串数组,将其中的每个字符串进行分组,要求每个分 ...
- [leetcode]49. Group Anagrams重排列字符串分组
是之前的重排列字符串的延伸,判断是重排列后存到HashMap中进行分组 这种HashMap进行分组的方式很常用 public List<List<String>> groupA ...
- ORACLE字符串分组聚合函数(字符串连接聚合函数)
ORACLE字符串连接分组串聚函数 wmsys.wm_concat SQL代码: select grp, wmsys.wm_concat(str) grp, 'a1' str from dual un ...
- LeetCode之“字符串”:最短回文子串
题目链接 题目要求: Given a string S, you are allowed to convert it to a palindrome by adding characters in f ...
- LeetCode之“字符串”:最长回文子串
题目要求: 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串.例如,给出字符串 "abcdzdcab",它的最长回文子串为 & ...
随机推荐
- 案例:使用sqlplus登录报ORA-12547错误
现象:Exadata刷机之后grid/oracle用户的环境变量是没有设置的,需要手工进行设置,设置完成后发现grid用户执行报错ORA-12547: [grid@dbm0dbadm01 ~]$ sq ...
- NC25879 外挂
题目链接 题目 题目描述 我的就是我的,你也是我的,记住了,狐狸! --韩信-白龙吟 对于打赌输了的小T会遭受到制裁,小s修改了数据库使他可以派出许多军队来围攻小T. 很不幸,小T与小s打赌打输了 ...
- java 从零开始手写 redis(七)LRU 缓存淘汰策略详解
前言 java从零手写实现redis(一)如何实现固定大小的缓存? java从零手写实现redis(三)redis expire 过期原理 java从零手写实现redis(三)内存数据如何重启不丢失? ...
- Centos7的KVM安装配置详解
KVM和虚拟化 虚拟化有几种类型: 完全虚拟化(Full virtualization), 虚机使用原始版本的操作系统, 直接与CPU通信, 是速度最快的虚拟化. 半虚拟化(Paravirtualiz ...
- Table布局
Table布局 <table>最常用的也是最正确的使用方法是制作表格,由于其对占据的空间有着划分的作用,便可以使用<table>来布局. 实例 实现一个简单的布局,将表格的bo ...
- Swoole从入门到入土(21)——毫秒定时器
Swoole提供了毫秒精度的定时器,所有操作都是内存操作,无额外的IO开销. 下面让我们一起详细了解每个函数的作用: 1) 函数tick:设置一个间隔时钟定时器,这个定时器会持续触发 Swoole\T ...
- Vmware中Linux通过NAT设置静态IP实现上网
1.设置虚拟机上网方式为NAT 2.修改centos网络配置文件,我的是centos7.4,主要网关不能和主机设置的一致 [root@dylan-centos ~]# vi /etc/sysconfi ...
- Spring源码之容器的功能拓展-ApplicationContext
目录 一.解析预备 刷新上下文环境 例如对系统属性或者环境变量进行校验和准备 二.初始化 BeanFactory 并进行 Xml 配置文件的读取 三.对BeanFactory 各种功能填充 四.激活以 ...
- C++ 多线程的错误和如何避免(12)
std::async 在简单的 IO 上比 std::thread 更有优势 前提:如果我们只需要一些异步执行的代码,这样不会阻塞主线程的执行,最好的办法是使用 std::async 来执行这些代码. ...
- Rtmp 开发学习
参考文章:视频传输协议详解(RTMP.RTSP.HLS) RTMP--Real Time Messaging Protocol(实时消息传输协议) RTMP 是由 Adobe 公司提出的,在互联网 T ...