概要
定义两个字符串X
和Y
相似如下:
交换X
中任意两个字符的位置一次,得到字符串Y
。
给定一个所有字符串长度相同的字符串数组,求出其中两两相似的字符串的集合数。
题解
将字符串看作“顶点”,将相似看作“边”,那么本题要求解的就是这个无向图中连通分量的个数;而对于一个无向图,仅需要一次深度优先搜索即可得到连通分量的个数。因此,本题可以分解为以下几个基本步骤:
- 求图
- 深度优先搜索
求图
对于数组中的字符串进行遍历,判断两两是否相似,相似则构建一条无向边。判断相似则是遍历数组X
,找到前两个与Y
不相同的字符,交换其位置并判断是否相等。设数组长度为$n$,字符串长度为$m$,那么这一步的时间复杂度为:
$$
O(n^2m)
$$
深度优先搜索
得到这一张无向图之后,对其进行深度优先搜索即可得到连通分量的个数,这一步的复杂度为点数与边数的和,顶点数已确定为$n$,那么在最坏情况下,一张全连通图的边数为
$$
\frac{n(n-1)}{2}
$$
那么这一步的时间复杂度为
$$
O(n^2)
$$
因此整个算法的时间复杂度为
$$
O(n^2m)
$$
本题除了要用到图论的思想外,自顶向下逐步分解也是比较重要的。