题目#

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的更多相关文章

  1. [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 ...

  2. Similar String Groups

    Two strings X and Y are similar if we can swap two letters (in different positions) of X, so that it ...

  3. 【LeetCode】839. 相似字符串组 Similar String Groups (Python)

    作者: 负雪明烛 id: fuxuemingzhu 公众号:每日算法题 本文关键词:LeetCode,力扣,算法,算法题,字符串,并查集,刷题群 目录 题目描述 解题思路 并查集 代码 刷题心得 欢迎 ...

  4. [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 ...

  5. 牛客练习赛33 E tokitsukaze and Similar String (字符串哈希hash)

    链接:https://ac.nowcoder.com/acm/contest/308/E 来源:牛客网 tokitsukaze and Similar String 时间限制:C/C++ 2秒,其他语 ...

  6. [LeetCode] Positions of Large Groups 大群组的位置

    In a string S of lowercase letters, these letters form consecutive groups of the same character. For ...

  7. [LeetCode] 800. Similar RGB Color 相似的红绿蓝颜色

    In the following, every capital letter represents some hexadecimal digit from 0 to f. The red-green- ...

  8. 【LeetCode】字符串 string(共112题)

    [3]Longest Substring Without Repeating Characters (2019年1月22日,复习) [5]Longest Palindromic Substring ( ...

  9. 【LeetCode】8. String to Integer (atoi) 字符串转换整数

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:字符串转整数,atoi,题解,Leetcode, 力扣,P ...

随机推荐

  1. React的PropTYpes

    React的PropTYpes和获取真实DOM 组件的属性可以接受任意值,字符串,对象,函数等等都可以.有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求. 组件类的PropsType ...

  2. oracle中准确控制job的下次运行时间(next date)

    用过ORACLE的JOB的朋友也许都能够感觉到它的强大,和JAVA中的quartz有异曲同工之妙,可以少了很多的重复劳动:但是也会有许多问题,就是执行时间段和执行时间比较不容易确定. 这其实都是我们还 ...

  3. leetcode 324 Wiggle Sort 2

    利用中位数的概念,中位数就是将一组数分成2等份(若为奇数,则中位数既不属于左也不属于右,所以是2等份),其一组数中任何一个元素都大于等于另一组数 那么我们是不是只要一左一右配合着插入,就保证了差值+- ...

  4. html常用标签7-多媒体标签

    1.html4中的标签:embed 定义嵌入的内容,可以插入多种形式的多媒体(有建瓯让问题,会用即可) <embed src="路径" type="类型" ...

  5. 深入浅出 Java Concurrency - 目录 [转]

    这是一份完整的Java 并发整理笔记,记录了我最近几年学习Java并发的一些心得和体会. J.U.C 整体认识 原子操作 part 1 从AtomicInteger开始 原子操作 part 2 数组. ...

  6. 469 Same Tree

    原题网址:https://www.lintcode.com/problem/same-tree/description 描述 检查两棵二叉树是否等价.等价的意思是说,首先两棵二叉树必须拥有相同的结构, ...

  7. OpenCASCADE动画功能

    OpenCASCADE动画功能 eryar@163.com 1.Introduction OpenCASCADE提供了类AIS_Animation等来实现简单的动画功能. 从其类图可以看出,动画功能有 ...

  8. 60行JavaScript代码俄罗斯方块

    教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏   早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下( ...

  9. PAT甲级——A1035 Password

    To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...

  10. boxFilter in opencv

    , -),bool normalize=true,int borderType=BORDER_DEFAULT) Smoothes image using box filter Parameters: ...