990. Satisfiability of Equality Equations
Title
給定一個(gè)由表示變量之間關(guān)系的字符串方程組成的數(shù)組,每個(gè)字符串方程 equations[i] 的長(zhǎng)度為 4,并采用兩種不同的形式之一:“a==b” 或 “a!=b”。在這里,a 和 b 是小寫字母(不一定不同),表示單字母變量名。
只有當(dāng)可以將整數(shù)分配給變量名,以便滿足所有給定的方程時(shí)才返回 true,否則返回 false。
示例 1:
輸入:["a==b","b!=a"]
輸出:false
解釋:如果我們指定,a = 1 且 b = 1,那么可以滿足第一個(gè)方程,但無法滿足第二個(gè)方程。沒有辦法分配變量同時(shí)滿足這兩個(gè)方程。
示例 2:
輸出:["b==a","a==b"]
輸入:true
解釋:我們可以指定 a = 1 且 b = 1 以滿足滿足這兩個(gè)方程。
示例 3:*
輸入:["a==b","b==c","a==c"]
輸出:true
示例 4:
輸入:["a==b","b!=c","c==a"]
輸出:false
示例 5:
輸入:["c==c","b==d","x!=z"]
輸出:true
提示:
1 <= equations.length <= 500
equations[i].length == 4
equations[i][0] 和 equations[i][3] 是小寫字母
equations[i][1] 要么是 ‘=’,要么是 ‘!’
equations[i][2] 是 ‘=’
Solve
并查集
可以將每一個(gè)變量看作圖中的一個(gè)節(jié)點(diǎn),把相等的關(guān)系==看作是兩個(gè)節(jié)點(diǎn)的邊,由于表示相等關(guān)系的等式方程具有傳遞性,即所有相等的變量屬于同一個(gè)連通分量,因此可以使用并查集來維護(hù)這種連通分量。
首先遍歷所有的等式,構(gòu)造并查集,同一個(gè)等式中的兩個(gè)變量屬于同一個(gè)連通分量,因此將兩個(gè)變量進(jìn)行合并。
然后遍歷所有的不等式,同一個(gè)不等式中的兩個(gè)變量不能屬于同一個(gè)連通分量,因此對(duì)兩個(gè)變量分別查找其所在的連通分量,如果兩個(gè)變量在同一個(gè)連通分量中,則產(chǎn)生矛盾,返回False。
如果遍歷完所有的不等式?jīng)]有發(fā)現(xiàn)矛盾,則返回True。
具體實(shí)現(xiàn)方面,使用一個(gè)數(shù)組 parent 存儲(chǔ)每個(gè)變量的連通分量信息,其中的每個(gè)元素表示當(dāng)前變量所在的連通分量的父節(jié)點(diǎn)信息,如果父節(jié)點(diǎn)是自身,說明該變量為所在的連通分量的根節(jié)點(diǎn)。
一開始所有變量的父節(jié)點(diǎn)都是它們自身。對(duì)于合并操作,我們將第一個(gè)變量的根節(jié)點(diǎn)的父節(jié)點(diǎn)指向第二個(gè)變量的根節(jié)點(diǎn);對(duì)于查找操作,我們沿著當(dāng)前變量的父節(jié)點(diǎn)一路向上查找,直到找到根節(jié)點(diǎn)。
復(fù)雜度分析
時(shí)間復(fù)雜度:O(n+ClogC),其中 n 是 equations 中的方程數(shù)量,C 是變量的總數(shù),在本題中變量都是小寫字母,即 C≤26。上面的并查集代碼中使用了路徑壓縮優(yōu)化,對(duì)于每個(gè)方程的合并和查找的均攤時(shí)間復(fù)雜度都是 O(logC)。由于需要遍歷每個(gè)方程,因此總時(shí)間復(fù)雜度是 O(n+ClogC)。
空間復(fù)雜度:O?。創(chuàng)建一個(gè)數(shù)組 parent 存儲(chǔ)每個(gè)變量的連通分量信息,由于變量都是小寫字母,因此 parent 是長(zhǎng)度為 C。
Code
class Solution:class UnionFind:def __init__(self):self.parent = list(range(26))def find(self, index):if index == self.parent[index]:return indexself.parent[index] = self.find(self.parent[index])return self.parent[index]def union(self, index1, index2):self.parent[self.find(index1)] = self.find(index2)def equationsPossible(self, equations: List[str]) -> bool:uf = Solution.UnionFind()for item in equations:if item[1] == '=':index1 = ord(item[0]) - ord("a")index2 = ord(item[3]) - ord("a")uf.union(index1, index2)for item in equations:if item[1] == '!':index1 = ord(item[0]) - ord("a")index2 = ord(item[3]) - ord("a")if uf.find(index1) == uf.find(index2):return Falsereturn True總結(jié)
以上是生活随笔為你收集整理的990. Satisfiability of Equality Equations的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 126. Word Ladder II
- 下一篇: 手把手教你搭建Hadoop生态系统伪分布