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 ...
随机推荐
- where方法的用法是ThinkPHP查询语言的精髓
where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询.表达式查询.快捷查询.区间查询.组合查询在内的查询操作.where方法 ...
- 思维构造,建图——cf1159E
很好的题 /* nexti:pi右边第一个比pi大的数的下标 把每个[i,a[i]]都看成一段区间,区间只能在端点处交叉,以此来判断是否有解 特别的,如果a[i]=-1,那么把a[i]=i+1,不对其 ...
- malloc在函数内分配内存问题
malloc函数用法可参考:C语言中 malloc函数用法 及 malloc函数 代码: void fun(char * p) { p=(); } void main() { char *p; fun ...
- hibernate 映射总结
单向一对多实体配置:在一的实体中设置多的一方SET集合配置文件:在一的一方用set 设置 one to many表配置:多方表的外键指向一方表的主键; 双向一对多实体配置:在一的实体中设置多的一方SE ...
- 【JEECG-Boot 技术文档】新手入门教程
Jeecg-Boot入门教程必看(新手学习) 1.开发环境搭建 http://jeecg-boot.mydoc.io/?t=345670 开发工具 :https://pan.baidu.com/sha ...
- cesium-长度测量和面积测量
网上找的大神的实现方法有点问题,实现有一些bug,作为cesium新手一个,弃之不忍,只好硬着头皮修改了,不过还好问题不大,再次mark一下,下次就可以直接用了 image.png import ...
- PAT甲级——A1093 Count PAT's【25】
The string APPAPT contains two PAT's as substrings. The first one is formed by the 2nd, the 4th, and ...
- 关于不同数据库的连接配置(MySql和Oracle)
mysql: driverClass=com.mysql.jdbc.Driver #在和mysql传递数据的过程中,使用unicode编码格式,并且字符集设置为utf-8,插入数据库防止中文乱码 ur ...
- Node中js获取异步操作的结果
js中要获取异步操作的结果必须使用回调函数 回调函数也被称为高阶函数,简单来说就是,函数作为一个参数传到另一个主函数里面,当那一个主函数执行完之后,再执行传进去的作为参数的函数 function fn ...
- python-web-selenium模拟控制浏览器
用 selenium 模块控制浏览器 启动 selenium 控制的浏览器 from selenium import webdriver brower = webdriver.Firefox() br ...