1class Solution {2public:3bool similar(string &s, string &t) {4int dif = 0;5for (int i = 0; i < s.size(); i++) {6if (s[i] != t[i]) {7dif++;8}9}10return dif <= 2;11}12void dfs(int node, vector<int> &vis, vector<vector<int>> &graph) {13vis[node] = 1;14for (auto &child : graph[node]) {15if (!vis[child]) {16dfs(child, vis, graph);17}18}19}20int numSimilarGroups(vector<string> &strs) {21int n = strs.size();22vector<vector<int>> graph(strs.size());23for (int i = 1; i < n; i++) {24for (int j = 0; j < i; j++) {25if (similar(strs[i], strs[j])) {26graph[i].push_back(j);27graph[j].push_back(i);28}29}30}31int ans = 0;32vector<int> vis(n);33for (int i = 0; i < n; i++) {34if (!vis[i]) {35dfs(i, vis, graph);36ans++;37}38}39return ans;40}41};