1. Pairwise Anagram Comparison with Visited Array
Intuition
Maintain a boolean visited array. For each unvisited string i: create a group with string_list[i], and for every j > i: if string_list[j] is an anagram of string_list[i], add to group and mark visited.
When to apply: Baseline comparison.
Algorithm
- Initialize
visited = [false] * N,res = []. - For
ifrom 0 toN - 1: - If
visited[i]: continue. -
group = [string_list[i]]; visited[i] = true. - For
jfromi + 1toN - 1: - If
!visited[j] && isAnagram(string_list[i], string_list[j]): -
group.push(string_list[j]); visited[j] = true. -
res.push(group). - Return
res.
Pairwise Anagram Comparison with Visited Array
2 of 2 questions left todayObservation: Track visited boolean array of size 5
Observation: Track visited boolean array of size 5. Unvisited word at index 0 is 'act'.
Decision: Start Group 1 with 'act'.
Invariant: Words assigned to groups are marked visited to prevent duplicate membership.
#include <iostream>#include <string>#include <vector>#include <algorithm> class Solution { bool isAnagram(const std::string& a, const std::string& b) { if (a.size() != b.size()) return false; int count[26] = {0}; for (char c : a) count[c - 'a']++; for (char c : b) count[c - 'a']--; for (int x : count) if (x != 0) return false; return true; }public: std::vector<std::vector<std::string>> anagrams(std::vector<std::string>& string_list) { int n = string_list.size(); std::vector<bool> visited(n, false); std::vector<std::vector<std::string>> res; for (int i = 0; i < n; ++i) { if (visited[i]) continue; std::vector<std::string> group; group.push_back(string_list[i]); visited[i] = true; for (int j = i + 1; j < n; ++j) { if (!visited[j] && isAnagram(string_list[i], string_list[j])) { group.push_back(string_list[j]); visited[j] = true; } } res.push_back(group); } return res; }}; int main() { Solution sol; std::vector<std::string> list = {"act", "god", "cat", "dog", "tac"}; auto ans = sol.anagrams(list); for (const auto& g : ans) { for (const auto& w : g) std::cout << w << " "; std::cout << "| "; } std::cout << std::endl; return 0;}Time & Space Complexity
- Time complexity:
O(N^2 * K)— N2 pairwise checks each comparing K characters. - Space complexity:
O(N)
Why Brute Force Doesn't Scale:
Using frequency tuples achieves strictly O(N * K) linear time without sorting.
Grouping strings directly into hash map value arrays.