問題
変数間の関係を表す文字列方程式の配列が与えられると、各文字列方程式方程式[i]の長さは4で、「a == b」または「a!= b」の2つの異なる形式のいずれかを取ります。
ここで、aとbは小文字(必ずしも異なる必要はありません)であり、1文字の変数名を表します。与えられたすべての方程式を満たすために整数を変数名に割り当てることができる場合にのみ、trueが返されます。それ以外の場合は、falseが返されます。
例1:
入力:["a == b"、 "b!= a"]
出力:false
説明:a = 1およびb = 1と指定すると、最初の式は満たされますが、2番目の式は満たされません。両方の方程式を同時に満たす変数を割り当てる方法はありません。
例2:
出力:["b == a"、 "a == b"]
入力:true
説明:これらの2つの方程式を満たすために、a = 1およびb = 1を指定できます。
アイデア
ユニオン検索の知識を使用して解決します。
(1)セット内の各式を判断します。「==」の場合、アルファベットの最初の判断文字の番号を2番目の値に割り当てる必要があります[後で再帰検索があります]、「!=」の場合、判定条件が等しくない文字が2つありますが、アルファベットの数字が等しい場合はFalseを返します。リストをトラバースした後、例外がない場合はTrueを返します。
(2)「!=」の判断が「==」の後にあることを確認する必要があります。【注意!!!】
コード
class Solution:
def equationPossible(self, equations):
self.p = [i for i in range(26)] # “数字”字母表
for eq in equations:
# '=='
for i in eq:
if eq[1] == '=':
r1 = self.find(ord(eq[0]) - ord('a'))
r2 = self.find(ord(eq[3]) - ord('a'))
if r1 != r2:
self.p[r2] = r1
for eq in equations:
# '!='
for i in eq:
if eq[1] == '!':
r1 = self.find(ord(eq[0]) - ord('a'))
r2 = self.find(ord(eq[3]) - ord('a'))
if r1 == r2:
return False
return True
def find(self, x):
if x == self.p[x]:
return self.p[x]
else:
self.p[x] = self.find(self.p[x]) # 寻找最初赋值【递归查找】
return self.p[x]
if __name__ == '__main__':
ep1 = Solution()
r = ep1.equationPossible(['a==b', 'b!=c', 'c==a'])
print(r)
関連情報
# ord()函数返回参数对应的ASCII 数值
# ord(c) c 为字符,返回值是对应的十进制整数。
>>>ord('a')
97
>>> ord('b')
98
>>> ord('c')
99