题目#

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. php中$_REQUEST、 $_GET、 $_POST、 $_COOKIE 的关系和区别

    看到REQUEST可以通吃GET .POST .COOKIE 后 感觉这个$_REQUEST太强大了是不是其他的几个超级变量就没有用了,下面对他们整体做个比较: 1.安全性 post>get 2 ...

  2. js获取网页屏高 屏宽

    <SCRIPT LANGUAGE="JavaScript"> <!-- //document.body.scrollTop 滚动条的上端距离 //document ...

  3. Redis深度历险——核心原理与应用实践

    高可用架构」的各位老铁们,你们好!你是否还记得上个月发布的文章中,有两篇深入讲解Redis的文章,分别是和,广大粉丝读者们对这两篇文章整体评价颇高.而我就是这两篇文章的原创作者「老钱」(钱文品),我是 ...

  4. iOS之CAShapeLayer属性简介

    1.CAShapeLayer需要和贝塞尔曲线一块使用! #import <QuartzCore/CALayer.h> NS_ASSUME_NONNULL_BEGIN CA_CLASS_AV ...

  5. 安装elasticsearch-head插件

    安装node ###下载 wget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.xz ### 解压 tar xvf nod ...

  6. Django之模板语言(三)------>自定义filter

    1.自定义filter: 1.在app01下面新建一个templatetags的python package包. 如果没有app01的话,可以通过命令行在manage中进行创建:python mana ...

  7. AppScan的基础使用

    AppScan是用于Web项目的安全测试工具,扫描网站所有url,自动测试是否存在各种类型的漏洞.AppScan安装在Windows环境上,版本越高,规则库越安全,扫描越全面.   1. 打开AppS ...

  8. HTML5定位功能,实现在百度地图上定位

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. _itoa _itow _itot atoi atof atol

    函数原型: char *_itoa( int value, char *string, int radix ); //ANSI wchar_t * _itow( int value, wchar_t ...

  10. JavaScript数据可视化编程书籍上面的例子(flotr2)

    先看demo再看例子 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...