Given an array equations of strings that represent relationships between variables, each string Return 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: 输入:["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 提示:
Runtime: 48 ms Memory Usage: 4 MB 1 class Solution { 2 func equationsPossible(_ equations: [String]) -> Bool { 3 var ds:DJSet = DJSet(26) 4 for e in equations 5 { 6 if e[1] == "=" 7 { 8 var l:Int = e[0].ascii - 97 9 var r:Int = e[3].ascii - 97 10 ds.union(l,r) 11 } 12 } 13 for e in equations 14 { 15 if e[1] == "!" 16 { 17 var l:Int = e[0].ascii - 97 18 var r:Int = e[3].ascii - 97 19 if ds.equiv(l,r) 20 { 21 return false 22 } 23 } 24 } 25 return true 26 } 27 } 28 29 extension String { 30 //subscript函数可以检索数组中的值 31 //直接按照索引方式截取指定索引的字符 32 subscript (_ i: Int) -> Character { 33 //读取字符 34 get {return self[index(startIndex, offsetBy: i)]} 35 } 36 } 37 38 extension Character 39 { 40 //属性:ASCII整数值(定义小写为整数值) 41 var ascii: Int { 42 get { 43 let s = String(self).unicodeScalars 44 return Int(s[s.startIndex].value) 45 } 46 } 47 } 48 49 public class DJSet 50 { 51 var upper:[Int] 52 53 init(_ n:Int) 54 { 55 upper = [Int](repeating:-1,count:n) 56 } 57 58 func root(_ x:Int) -> Int 59 { 60 if(upper[x] < 0) 61 { 62 return x 63 } 64 else 65 { 66 upper[x] = root(upper[x]) 67 return upper[x] 68 } 69 } 70 71 func equiv(_ x:Int,_ y:Int) -> Bool 72 { 73 return root(x) == root(y) 74 } 75 76 func union(_ x:Int,_ y:Int) -> Bool 77 { 78 var x:Int = root(x) 79 var y:Int = root(y) 80 if x != y 81 { 82 if upper[y] < upper[x] 83 { 84 var d:Int = x 85 x = y 86 y = d 87 } 88 upper[x] = upper[y] 89 upper[y] = x 90 } 91 return x == y 92 } 93 94 func count() -> Int 95 { 96 var ct:Int = 0 97 for u in upper 98 { 99 if u < 0 100 { 101 ct = 1 102 } 103 } 104 return ct 105 } 106 } 来源:http://www./content-4-112251.html |
|