给出长度相同的两个字符串:A
和 B
,其中 A[i] 和 B[i] 是一组等价字符。举个例子,如果 A = "abc"
且 B = "cde"
,那么就有 ‘a‘ == ‘c‘,‘b‘ == ‘d‘,‘c‘ == ‘e‘
。
等价字符遵循任何等价关系的一般规则:
- 自反性:‘a‘ == ‘a‘
- 对称性:‘a‘ == ‘b‘ 则必定有 ‘b‘ == ‘a‘
- 传递性:‘a‘ == ‘b‘ 且 ‘b‘ == ‘c‘ 就表明 ‘a‘ == ‘c‘
例如,A
和 B
的等价信息和之前的例子一样,那么 S = "eed"
, "acd"
或 "aab"
,这三个字符串都是等价的,而 "aab"
是 S
的按字典序最小的等价字符串
利用 A
和 B
的等价信息,找出并返回 S
的按字典序排列最小的等价字符串。
示例 1:
输入:A = "parker",B = "morris",S = "parser" 输出:"makkek" 解释:根据 和 我们可以将这些字符分为,。每组中的字符都是等价的,并按字典序排列。所以答案是 。 AB 中的等价信息,[m,p][a,o][k,r,s][e,i] 共 4 组"makkek"
示例 2:
输入:A = "hello",B = "world",S = "hold" 输出:"hdld" 解释:根据 和 我们可以将这些字符分为,。所以只有 S 中的第二个字符 变成 。 AB 中的等价信息,[h,w][d,e,o][l,r] 共 3 组‘o‘‘d‘,最后答案为"hdld"
示例 3:
输入:A = "leetcode",B = "programs",S = "sourcecode" 输出:"aauaaaaada" 解释:我们可以把 A 和 B 中的等价字符分为,和 ,因此 中除了 和 之外的所有字母都转化成了 ,最后答案为 。[a,o,s,c][l,p][g,t][d,m] 共 4 组S‘u‘‘d‘‘a‘"aauaaaaada"
提示:
- 字符串
A
,B
和S
仅有从‘a‘
到‘z‘
的小写英文字母组成。 - 字符串
A
,B
和S
的长度在1
到1000
之间。 - 字符串
A
和B
长度相同。
80 ms
1 class Solution { 2 var f:[Int] = [Int](repeating:0,count:26) 3 func smallestEquivalentString(_ A: String,_ B: String,_ S: String) -> String { 4 var n:Int = A.count 5 var m:Int = S.count 6 var ans:String = String() 7 for i in 0..<26 8 { 9 f[i] = i 10 } 11 for i in 0..<n 12 { 13 merge(A[i].ascii - 97,B[i].ascii - 97) 14 } 15 for i in 0..<m 16 { 17 ans.append((get(S[i].ascii - 97) + 97).ASCII) 18 } 19 return ans 20 } 21 22 func get(_ x:Int) -> Int 23 { 24 if f[x] == x 25 { 26 return x 27 } 28 f[x] = get(f[x]) 29 return f[x] 30 } 31 32 func merge(_ x:Int,_ y:Int) 33 { 34 var x = x 35 var y = y 36 x = get(x) 37 y = get(y) 38 if x < y 39 { 40 (x,y) = (y,x) 41 } 42 f[x] = y 43 } 44 } 45 46 //String扩展 47 extension String { 48 //subscript函数可以检索数组中的值 49 //直接按照索引方式截取指定索引的字符 50 subscript (_ i: Int) -> Character { 51 //读取字符 52 get {return self[index(startIndex,offsetBy: i)]} 53 } 54 } 55 56 //Character扩展 57 extension Character 58 { 59 //Character转ASCII整数值(定义小写为整数值) 60 var ascii: Int { 61 get { 62 return Int(self.unicodeScalars.first?.value ?? 0) 63 } 64 } 65 } 66 67 //Int扩展 68 extension Int 69 { 70 //Int转Character,ASCII值(定义大写为字符值) 71 var ASCII:Character 72 { 73 get {return Character(UnicodeScalar(self)!)} 74 } 75 }