LeetCode 990 - Satisfiability of Equality Equations


https://leetcode.com/problems/satisfiability-of-equality-equations/
Given an array equations of strings that represent relationships between variables, each string equations[i] has length 4and takes one of two different forms: "a==b" or "a!=b".  Here, a and b are lowercase letters (not necessarily different) that represent one-letter variable names.
Return true if and only if it is possible to assign integers to variable names so as to satisfy all the given equations.

    Example 1:
    Input: ["a==b","b!=a"]
    Output: false
    Explanation: If we assign say, a = 1 and b = 1, then the first equation is satisfied, but not the second.  There is no way to assign the variables to satisfy both equations.
    
    Example 2:
    Input: ["b==a","a==b"]
    Output: true
    Explanation: We could assign a = 1 and b = 1 to satisfy both equations.
    
    Example 3:
    Input: ["a==b","b==c","a==c"]
    Output: true
    
    Example 4:
    Input: ["a==b","b!=c","c==a"]
    Output: false
    
    Example 5:
    Input: ["c==c","b==d","x!=z"]
    Output: true
    

    Note:
    1. 1 <= equations.length <= 500
    2. equations[i].length == 4
    3. equations[i][0] and equations[i][3] are lowercase letters
    4. equations[i][1] is either '=' or '!'
    5. equations[i][2] is '='
    https://leetcode.com/problems/satisfiability-of-equality-equations/discuss/234486/JavaC%2B%2BPython-Easy-Union-Find
    We have 26 nodes in the graph.
    All "==" equations actually represent the connection in the graph.
    The connected nodes should be in the same color/union/set.
    Then we check all inequations.
    Two inequal nodes should be in the different color/union/set.
    Explanation
    We can solve this problem by DFS or Union Find.
    Firt pass all "==" equations.
    Union equal letters together
    Now we know which letters must equal to the others.
    Second pass all "!=" inequations,
    Check if there are any contradict happens.
    Time Complexity:
    Union Find Operation, amortized O(1)
    First pass all equations, O(N)
    Second pass all inequations, O(N)


        int[] uf = new int[26];
        public boolean equationsPossible(String[] equations) {
            for (int i = 0; i < 26; ++i) uf[i] = i;
            for (String e : equations)
                if (e.charAt(1) == '=')
                    uf[find(e.charAt(0) - 'a')] = find(e.charAt(3) - 'a');
            for (String e : equations)
                if (e.charAt(1) == '!' && find(e.charAt(0) - 'a') == find(e.charAt(3) - 'a'))
                    return false;
            return true;
        }
    
        public int find(int x) {
            if (x != uf[x]) uf[x] = find(uf[x]);
            return uf[x];
        }
    
    https://leetcode.com/problems/satisfiability-of-equality-equations/discuss/234555/Classic-Union-Find-Java-Solution-Beats-100-Time-and-Memory
        private int[] parents;
        private int circles;
        
        public UnionFind(int n){
            parents = new int[n]; // create parent for each node
            for(int i=0; i<n; i++){
                parents[i] = i; // mark parent of each node as node itself
            }
            circles = n;
        }
        
        public int find(int x){
            if(parents[x] == x){
                return x;
            }
            // recur to find parent of this node
            return find(parents[x]);
        }
        
        public void union(int a, int b){
            int groupA = find(a);
            int groupB = find(b);
            
            if(groupA != groupB){
                parents[groupA] = groupB; // connect as we want to put them in the same circle
                circles--; // decrease the group count or the circle count
            }
        }
    }
    
        public boolean equationsPossible(String[] eqns) {
            
            UnionFind u1 = new UnionFind(26);
            
            for(int i=0; i<eqns.length; i++){
                if(eqns[i].charAt(1) == '='){
                    u1.union(eqns[i].charAt(0) - 'a', eqns[i].charAt(3) - 'a');
                }
            }
            
            for(int i=0; i<eqns.length; i++){
                if(eqns[i].charAt(1) == '!'){
                    int g1 = u1.find(eqns[i].charAt(0) - 'a');
                    int g2 = u1.find(eqns[i].charAt(3) - 'a');
                    if(g1 == g2){
                        return false;
                    }
                }
            }
            
            return true;
        }
    X. https://leetcode.com/articles/satisfiability-of-equality-equations/
    Approach 1: Connected Components
    All variables that are equal to each other form connected components. For example, if a=b, b=c, c=dthen a, b, c, d are in the same connected component as they all must be equal to each other.
    Algorithm
    First, we use a depth first search to color each variable by connected component based on these equality equations.
    After coloring these components, we can parse statements of the form a != b. If two components have the same color, then they must be equal, so if we say they can't be equal then it is impossible to satisfy the equations.
    Otherwise, our coloring demonstrates a way to satisfy the equations, and thus the result is true.

      public boolean equationsPossible(String[] equations) {
          ArrayList<Integer>[] graph = new ArrayList[26];
          for (int i = 0; i < 26; ++i)
              graph[i] = new ArrayList<>();

          for (String eqn: equations) {
              if (eqn.charAt(1) == '=') {
                  int x = eqn.charAt(0) - 'a';
                  int y = eqn.charAt(3) - 'a';
                  graph[x].add(y);
                  graph[y].add(x);
              }
          }

          int[] color = new int[26];
          int t = 0;
          for (int start = 0; start < 26; ++start) {
              if (color[start] == 0) {
                  t++;
                  Stack<Integer> stack = new Stack<Integer>();
                  stack.push(start);
                  while (!stack.isEmpty()) {
                      int node = stack.pop();
                      for (int nei: graph[node]) {
                          if (color[nei] == 0) {
                              color[nei] = t;
                              stack.push(nei);
                          }
                      }
                  }
              }
          }

          for (String eqn: equations) {
              if (eqn.charAt(1) == '!') {
                  int x = eqn.charAt(0) - 'a';
                  int y = eqn.charAt(3) - 'a';
                  if (x == y || color[x] != 0 && color[x] == color[y])
                      return false;
              }
          }

          return true;
      }

    X. DFS
    https://leetcode.com/problems/satisfiability-of-equality-equations/discuss/234491/Simple-Java-DFS-solution-by-building-graph
    https://aonecode.com/aplusplus/interviewctrl/getInterview/5478025948892386815

    Labels

    LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

    Popular Posts