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

贴代码:

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 字符串分组的更多相关文章

  1. Leetcode中字符串总结

    本文是个人对LeetCode中字符串类型题目的总结,纯属个人感悟,若有不妥的地方,欢迎指出. 一.有关数字 1.数转换 题Interger to roman和Roman to integer这两题是罗 ...

  2. LeetCode:字符串的排列【567】

    LeetCode:字符串的排列[567] 题目描述 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: ...

  3. 前端与算法 leetcode 8. 字符串转换整数 (atoi)

    目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...

  4. 前端与算法 leetcode 387. 字符串中的第一个唯一字符

    目录 # 前端与算法 leetcode 387. 字符串中的第一个唯一字符 题目描述 概要 提示 解析 解法一:双循环 解法二:Set法单循环 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...

  5. LeetCode:字符串相加【415】

    LeetCode:字符串相加[415] 题目描述 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100.num1 和num2 都只 ...

  6. LeetCode 49 Group Anagrams(字符串分组)

    题目链接: https://leetcode.com/problems/anagrams/?tab=Description   Problem:给一个字符串数组,将其中的每个字符串进行分组,要求每个分 ...

  7. [leetcode]49. Group Anagrams重排列字符串分组

    是之前的重排列字符串的延伸,判断是重排列后存到HashMap中进行分组 这种HashMap进行分组的方式很常用 public List<List<String>> groupA ...

  8. ORACLE字符串分组聚合函数(字符串连接聚合函数)

    ORACLE字符串连接分组串聚函数 wmsys.wm_concat SQL代码: select grp, wmsys.wm_concat(str) grp, 'a1' str from dual un ...

  9. LeetCode之“字符串”:最短回文子串

    题目链接 题目要求: Given a string S, you are allowed to convert it to a palindrome by adding characters in f ...

  10. LeetCode之“字符串”:最长回文子串

    题目要求: 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串.例如,给出字符串 "abcdzdcab",它的最长回文子串为 & ...

随机推荐

  1. 小知识:Exadata平台去掉密码输错延迟10分钟登录

    生产环境不评价,若是测试环境实在受不了偶尔一次因为密码输错就要等待10分钟才能登陆的限制. 那测试环境下,如何关闭这个限制呢?很简单: # vi /etc/pam.d/sshd --找到并注释掉下面这 ...

  2. 深入浅出 testing-library

    我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:佳岚 The more your tests resemb ...

  3. 《ASP.NET Core 微服务实战》-- 读书笔记(第1章 、第2章)

    译者序 微服务设计方法清晰定义了各个开发团队的业务边界,微服务框架以不同方式实现了服务之间的协作与集成. .NET Core 作为全新的 .NET 技术,它不仅完全开源.跨平台,更面向云原生开发进行了 ...

  4. ABC 313

    前三题过水. D题 与 5+*的题解 注意:交互题每输出一次,就要 fflush(stdout); 一次 E 其实不是太难,但是赛时一直在搓 D 还没搓出来 首先如果有两个大于 \(1\) 的数相邻, ...

  5. Js文件异步加载

    Js文件异步加载 浏览器中渲染引擎与Js脚本引擎是互斥的,在浏览器开始渲染页面时,如果遇到<script>标签,会停止渲染当前页面,也就是说在脚本加载与执行的过程中会阻塞页面的渲染,在网速 ...

  6. Python之机器人卡牌

    介绍 这个例子主要利用turtle库实现根据输入动态展示不同机器人的图像和属性信息. 代码部分非原创只是做了些许修改和整理使得更易阅读. 图片和文件资源请访问git仓库获取: https://gite ...

  7. 美团面试:Kafka如何处理百万级消息队列?

    美团面试:Kafka如何处理百万级消息队列? 在今天的大数据时代,处理海量数据已成为各行各业的标配.特别是在消息队列领域,Apache Kafka 作为一个分布式流处理平台,因其高吞吐量.可扩展性.容 ...

  8. iptables临时控制某ip访问权限

    iptables -A INPUT -p tcp -s {src_ip} --dport 80 -j ACCEPT iptables -A INPUT -p tcp -s {src_ip} --dpo ...

  9. Google C++ 风格指南记录

    最近在看谷歌的 C++ 风格指南发现了一些有意思的知识点,遂记录下 1. 第六章第二小节介绍了右值引用 只在定义移动构造函数与移动赋值操作时使用右值引用. 不要使用 std::forward. 定义: ...

  10. gin框架中的c.Next()/c.Abort()

    package main import ( "fmt" "github.com/gin-gonic/gin" ) func func1(c *gin.Conte ...