給定乙個由表示變數之間關係的字串方程組成的陣列,每個字串方程 equations[i] 的長度為 4,並採用兩種不同的形式之一:「a==b」 或 「a!=b」。在這裡,a 和 b 是小寫字母(不一定不同),表示單字母變數名。
只有當可以將整數分配給變數名,以便滿足所有給定的方程時才返回 true,否則返回 false。
示例 1:
輸入:[「a==b」,「b!=a」]
輸出:false
解釋:如果我們指定,a = 1 且 b = 1,那麼可以滿足第乙個方程,但無法滿足第二個方程。沒有辦法分配變數同時滿足這兩個方程。
示例 2:
輸出:[「b==a」,「a==b」]
輸入:true
解釋:我們可以指定 a = 1 且 b = 1 以滿足滿足這兩個方程。
示例 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]是 『=』
這道題目需要使用到並查集,簡單來描述一下並查集就是初始每個元素都是乙個集合,在遍歷的過程中如果發現兩個元素屬於乙個集合,就將這兩個集合進行合併。那麼如何判斷兩個元素屬於乙個集合呢?可以為每個元素設定乙個「根節點」,初始每個元素的根節點都是自己,之後如果發現a和b屬於乙個集合,就將b的根節點指向a,這樣通過層層的遍歷直到乙個元素的根節點指向自己,就是這個集合的根節點。
對於這道題目來說,首先將每個字母的根節點指向自己,可以用乙個int[26]陣列來儲存,因為只能是26個字母之間進行比較,用int來儲存下標,『a』記為0,得到這個int值的方法是letter-』a』,letter為任意乙個字母。首先遍歷陣列中為等式的字串,將相等的字母進行合併,即假設a==b,則讓a所在集合的根節點指向b所在集合的根節點,這樣就將a、b分別所在的集合進行了合併,即這個集合中的元素都是相等的。在遍歷完等式後再去遍歷不等式,此時若不等式兩端的字母屬於同乙個集合,那麼直接返回false,直到所有不等式也被遍歷完成,返回true。
class
solution
}for
(string str:equations)
}return
true;}
public
void
merge
(int
par,
char x,
char y)
public
intfind
(int
par,
char n)
}
執行時間
1ms100%
消耗記憶體
39.2%
16.67%
leetcode 990 等式方程 (6 8刷題)
思路 相等的關係可以傳遞,最終的結果集必然是若干個集合,每個集合裡的變數擁有相同的值,即處在同乙個連通分量裡。而不等關係則是兩個變數在不同的連通分量裡。所以,先針對相等關係建立並查集,而後判斷每個不等關係是否都滿足即可。class solution return t public void unio...
LeetCode 990 等式方程的可滿足性 中等
給定乙個由表示變數之間關係的字串方程組成的陣列,每個字串方程 equations i 的長度為 4,並採用兩種不同的形式之一 a b 或 a b 在這裡,a 和 b 是小寫字母 不一定不同 表示單字母變數名。只有當可以將整數分配給變數名,以便滿足所有給定的方程時才返回 true,否則返回 false...
leetcode 990 等式方程的可滿足性
題目鏈結 給定乙個由表示變數之間關係的字串方程組成的陣列,每個字串方程 equations i 的長度為 4,並採用兩種不同的形式之一 a b 或 a b 在這裡,a 和 b 是小寫字母 不一定不同 表示單字母變數名。只有當可以將整數分配給變數名,以便滿足所有給定的方程時才返回 true,否則返回 ...