[leetcode](4.21)2. 按字典序排列最小的等效字符串
程序员文章站
2024-01-24 16:06:40
给出长度相同的两个字符串:A 和 B,其中 A[i] 和 B[i] 是一组等价字符。举个例子,如果 A = "abc" 且 B = "cde",那么就有 'a' == 'c', 'b' == 'd', 'c' == 'e'。 等价字符遵循任何等价关系的一般规则: 自反性:'a' == 'a' 对称性 ......
给出长度相同的两个字符串: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" 解释:根据 a 和 b 中的等价信息,我们可以将这些字符分为 [m,p], [a,o], [k,r,s], [e,i] 共 4 组。每组中的字符都是等价的,并按字典序排列。所以答案是 "makkek"。
示例 2:
输入:a = "hello", b = "world", s = "hold" 输出:"hdld" 解释:根据 a 和 b 中的等价信息,我们可以将这些字符分为 [h,w], [d,e,o], [l,r] 共 3 组。所以只有 s 中的第二个字符 'o' 变成 'd',最后答案为 "hdld"。
示例 3:
输入:a = "leetcode", b = "programs", s = "sourcecode" 输出:"aauaaaaada" 解释:我们可以把 a 和 b 中的等价字符分为 [a,o,e,r,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
长度相同。
并查集
class solution { public string smallestequivalentstring(string a, string b, string s) { int []value = new int[26]; for(int i = 0;i < 26;i++) value[i]=i; for(int i = 0;i < a.length();i++) { if(value[a.charat(i)-'a'] != value[b.charat(i)-'a']) { int a = value[a.charat(i)-'a']; int b = value[b.charat(i)-'a']; int min = a<b?a:b; for(int j = 0;j < 26;j++) if(value[j]==a||value[j]==b) value[j]=min; } } string ans = ""; for(int i = 0;i < s.length();i++) ans = ans + (char)(value[s.charat(i)-'a']+(int)'a'); return ans; } }