leetcode 839 Similar String Groups
题目#
Two strings X and Y are similar if we can swap two letters (in different positions) of X, so that it equals Y.
We are given a list A of strings. Every string in A is an anagram of every other string in A. How many groups are there?
anagram 这个词的意思被忽略导致我误理解了题意
Intuition#
我们可以在 Ow 的时间内分辨 两个words 是否相似
一种思想是纯使用暴力算法 : n2W 的时间内判断两个单词是否详细
另一种想法是 枚举一个单词的所有相似紧邻 一个单词之多有 C2w 个紧邻
W2 的时间用来枚举所有的可能相似单词 W 时间
这样我们可以使用 ONW3 的时间 列出所有的单词相邻
py2 版本
class DSU(object,N):
def __init__(self):
self.par=range(N)
def find(self,x):
if(self.par[x]!=x):
self.par[x]= self.find(par[x])
return self.par[x]
def union(self,x,y):
if(x!=y):
self.par[self.find(x)]=self.find(y)
class Solution(object):
def numSimilarGroups(self,A):
N,w=len(A),len(A[0]) # 分别是词的个数和 词的长度
def similar(W1,W2):
diff=0
for x,y in itertools.izip(W1,W2):
if x!=y:
diff=dfif+1
return diff <=2
dsu=DSU(N)
if(N<W*W): //如果整个词列表较短, 遍历整个词列表进行计算会更快
for (i1,word1),(i2,word2) in itertools.combinations(enumerate(A),2):#高效的枚举操作 ,也是py支持的非常有用的操作
if similar(word1,word2):
dsu.union(i1,i2) #使用编号作为合并的索引
else:
buckets=collections.defaultdict(set) # values 是set 且具有默认值的字典
for i,word in enumerate(A):
L=list(word) # string 调换中间某几个字符顺序的最佳操作
for j0,j1 in itertools.combinations(xrange(N),2): 组合操作的最佳方式 使用itertools
L[j0], L[j1] = L[j1], L[j0]
buckets["".join(L)].add(i)
L[j0], L[j1] = L[j1], L[j0]
for i1, word in enumerate(A):
for i2 in buckets[word]:
dsu.union(i1, i2)
return sum([for dsu.par[x]==x for x in range(N)]) #并查集变通块数量的查询简易方法
以上的代码虽然正确,但是复杂度高 ,不能通过(py3 的方式重写之后 不能通过py3 的测试)
下面是 加速版本
class Solution:
def numSimilarGroups(self, A):
SA = set(A) # to delete duplicate items
A = list(SA) # make it indexable
L = len(A)
base = [i for i in range(L)]
def find(x):
if base[x] != x:
base[x] = find(base[x])
return base[x]
def union(x, y):
base[find(x)] = find(y)
def check(x, y):
return sum(a!=b for a, b in zip(A[x], A[y])) == 2
if L < len(A[0])**2: # deal with long word with few items
for i1, i2 in itertools.combinations(range(L), 2):
if check(i1, i2):
union(i1, i2)
else: # deal with short word with lots of items
buckets = collections.defaultdict(set)
for i, word in enumerate(A):
for i1, i2 in itertools.combinations(range(len(word)), 2):
if word[i1] != word[i2]: # filter, otherwise it will exceed memory limit
wl = list(word)
wl[i1], wl[i2] = wl[i2], wl[i1]
key = "".join(wl)
if key in SA:
buckets[key].add(i)
for i, word in enumerate(A):
for j in buckets[word]:
union(i, j)
return sum(base[x] == x for x in range(L))
可以看到 这里将dsu 单独拿出来使用,
然后在枚举 一个单词的所有邻居的时候 也进行了优化 就是如果这个单词的两个位置不一样 我们才认为是一个合法的邻居。
leetcode 839 Similar String Groups的更多相关文章
- [LeetCode] 839. Similar String Groups 相似字符串组
Two strings X and Y are similar if we can swap two letters (in different positions) of X, so that it ...
- Similar String Groups
Two strings X and Y are similar if we can swap two letters (in different positions) of X, so that it ...
- 【LeetCode】839. 相似字符串组 Similar String Groups (Python)
作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:LeetCode,力扣,算法,算法题,字符串,并查集,刷题群 目录 题目描述 解题思路 并查集 代码 刷题心得 欢迎 ...
- [Swift]LeetCode839. 相似字符串组 | Similar String Groups
Two strings X and Y are similar if we can swap two letters (in different positions) of X, so that it ...
- 牛客练习赛33 E tokitsukaze and Similar String (字符串哈希hash)
链接:https://ac.nowcoder.com/acm/contest/308/E 来源:牛客网 tokitsukaze and Similar String 时间限制:C/C++ 2秒,其他语 ...
- [LeetCode] Positions of Large Groups 大群组的位置
In a string S of lowercase letters, these letters form consecutive groups of the same character. For ...
- [LeetCode] 800. Similar RGB Color 相似的红绿蓝颜色
In the following, every capital letter represents some hexadecimal digit from 0 to f. The red-green- ...
- 【LeetCode】字符串 string(共112题)
[3]Longest Substring Without Repeating Characters (2019年1月22日,复习) [5]Longest Palindromic Substring ( ...
- 【LeetCode】8. String to Integer (atoi) 字符串转换整数
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:字符串转整数,atoi,题解,Leetcode, 力扣,P ...
随机推荐
- Python-匿名函数与异常处理
目录 匿名函数 什么叫匿名函数? 语法 max/min() sorted() map() filter() reduce函数 内置函数 面向过程编程 异常处理 什么是异常 异常的种类 异常处理 try ...
- js 面向对象几种数据模式
一.单例模式: 把描述同一事物的属性和方法放在同一内存空间下,实现了分组的作用,防止同一属性或者方法冲突.我们把这种分组编写代码的模式叫做单例模式即普通的对象. 单例模式是项目开发中最常用的一种开发模 ...
- Composer的简介说明与安装
https://mp.weixin.qq.com/s/aSZRhoa2-JjKOTRVhPdxdQ Composer 是 PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为 ...
- 关于 ros
1.https://mikrotik.com/download 下载 x86 架构的 cd image (当日这是试用版,特殊版下载后道理一样) 2.exsi 上传,并新建 linux 的 其他 ...
- CentOS源码安装Wireshark
(2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2016年8月25日) Wireshark为网络管理员常用的一个网络管理工具,通过使用这个软件,我们可以对本机网卡上的经过的 ...
- HttpServletRequest request 获取当前登录的用户-获取当前用户
有的业务需要知道当前登录的用户 当然需要引用这个啦 import javax.servlet.http.HttpServletRequest; 然后 HttpSession session = req ...
- 项目无法依赖Springboot打出的jar
1.原因 因为springboot-maven-plugin打包的第一级目录为Boot-INF,无法引用 2.解决 不能使用springboot项目自带的打包插件进行打包 <build> ...
- CAS服务端配置
1. 产生SERVER的证书库文件 ketool工具详细运用:http://www.micmiu.com/lang/java/keytool-start-guide/ 首先确保jdk环境变了正确配置才 ...
- Ubuntu18上安装Go和GoLand
第一步骤:安装Go 方式一: 使用 sudo apt-get install golang命令安装 ubuntu软件库里当前golang版本为1.10,(golang最新版为1.11),可满足要求. ...
- 搭建一个Semantic-ui项目
一.进入到项目目录 npm init 二.安装semantic-ui npm install semantic-ui --save 三.编译输出semantic-ui cd ./semantic g ...