【LeetCode】839. Similar String Groups

Problem Link

概要

定义两个字符串XY相似如下:

交换X中任意两个字符的位置一次,得到字符串Y

给定一个所有字符串长度相同的字符串数组,求出其中两两相似的字符串的集合数。

题解

将字符串看作“顶点”,将相似看作“边”,那么本题要求解的就是这个无向图中连通分量的个数;而对于一个无向图,仅需要一次深度优先搜索即可得到连通分量的个数。因此,本题可以分解为以下几个基本步骤:

  • 求图
  • 深度优先搜索

求图

对于数组中的字符串进行遍历,判断两两是否相似,相似则构建一条无向边。判断相似则是遍历数组X,找到前两个与Y不相同的字符,交换其位置并判断是否相等。设数组长度为$n$,字符串长度为$m$,那么这一步的时间复杂度为:

$$
O(n^2m)
$$

深度优先搜索

得到这一张无向图之后,对其进行深度优先搜索即可得到连通分量的个数,这一步的复杂度为点数与边数的和,顶点数已确定为$n$,那么在最坏情况下,一张全连通图的边数为

$$
\frac{n(n-1)}{2}
$$

那么这一步的时间复杂度为

$$
O(n^2)
$$

因此整个算法的时间复杂度为

$$
O(n^2m)
$$

本题除了要用到图论的思想外,自顶向下逐步分解也是比较重要的。

附录

本人解答