-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy path1061.java
More file actions
78 lines (78 loc) · 3.13 KB
/
Copy path1061.java
File metadata and controls
78 lines (78 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// 1061. Lexicographically Smallest Equivalent String
//
// You are given two strings of the same length s1 and s2 and a string baseStr.
//
// We say s1[i] and s2[i] are equivalent characters.
//
// For example, if s1 = "abc" and s2 = "cde", then we have 'a' == 'c', 'b' == 'd', and 'c' == 'e'.
// Equivalent characters follow the usual rules of any equivalence relation:
//
// Reflexivity: 'a' == 'a'.
// Symmetry: 'a' == 'b' implies 'b' == 'a'.
// Transitivity: 'a' == 'b' and 'b' == 'c' implies 'a' == 'c'.
// For example, given the equivalency information from s1 = "abc" and s2 = "cde", "acd" and "aab" are equivalent strings of baseStr = "eed", and "aab" is the lexicographically smallest equivalent string of baseStr.
//
// Return the lexicographically smallest equivalent string of baseStr by using the equivalency information from s1 and s2.
//
//
//
// Example 1:
//
// Input: s1 = "parker", s2 = "morris", baseStr = "parser"
// Output: "makkek"
// Explanation: Based on the equivalency information in s1 and s2, we can group their characters as [m,p], [a,o], [k,r,s], [e,i].
// The characters in each group are equivalent and sorted in lexicographical order.
// So the answer is "makkek".
// Example 2:
//
// Input: s1 = "hello", s2 = "world", baseStr = "hold"
// Output: "hdld"
// Explanation: Based on the equivalency information in s1 and s2, we can group their characters as [h,w], [d,e,o], [l,r].
// So only the second letter 'o' in baseStr is changed to 'd', the answer is "hdld".
// Example 3:
//
// Input: s1 = "leetcode", s2 = "programs", baseStr = "sourcecode"
// Output: "aauaaaaada"
// Explanation: We group the equivalent characters in s1 and s2 as [a,o,e,r,s,c], [l,p], [g,t] and [d,m], thus all letters in baseStr except 'u' and 'd' are transformed to 'a', the answer is "aauaaaaada".
//
//
// Constraints:
//
// 1 <= s1.length, s2.length, baseStr <= 1000
// s1.length == s2.length
// s1, s2, and baseStr consist of lowercase English letters.
//
// Runtime 2 ms Beats 95.1%
// Memory 40.8 MB Beats 96.91%
class Solution {
public String smallestEquivalentString(String s1, String s2, String baseStr) {
char[] mapping = new char[26];
for (int i = 0; i < 26; i++) {
mapping[i] = (char) ('a' + i);
}
for (int i = 0; i < s1.length(); i++) {
char c1 = s1.charAt(i);
char c2 = s2.charAt(i);
if (mapping[c1 - 'a'] < mapping[c2 - 'a']) {
char temp = mapping[c2 - 'a'];
for (int j = 0; j < 26; j++) {
if (mapping[j] == temp) {
mapping[j] = mapping[c1 - 'a'];
}
}
} else if (mapping[c1 - 'a'] > mapping[c2 - 'a']) {
char temp = mapping[c1 - 'a'];
for (int j = 0; j < 26; j++) {
if (mapping[j] == temp) {
mapping[j] = mapping[c2 - 'a'];
}
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < baseStr.length(); i++) {
sb.append(mapping[baseStr.charAt(i) - 'a']);
}
return sb.toString();
}
}