Skip to content

Commit 284eb58

Browse files
committed
feat: update solutions to lc problem: No.0953
No.0953.Verifying an Alien Dictionary
1 parent 57ec4f2 commit 284eb58

File tree

6 files changed

+168
-184
lines changed

6 files changed

+168
-184
lines changed

solution/0900-0999/0953.Verifying an Alien Dictionary/README.md

+56-63
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,19 @@
6060
```python
6161
class Solution:
6262
def isAlienSorted(self, words: List[str], order: str) -> bool:
63-
index = {c: i for i, c in enumerate(order)}
64-
for i in range(len(words) - 1):
65-
w1, w2 = words[i], words[i + 1]
66-
l1, l2 = len(w1), len(w2)
67-
flag = False
68-
for j in range(max(l1, l2)):
69-
i1, i2 = -1 if j >= l1 else index[w1[j]], -1 if j >= l2 else index[w2[j]]
70-
if i1 > i2:
71-
# 说明不是按字典序排序,直接返回False
63+
m = {c: i for i, c in enumerate(order)}
64+
for i in range(20):
65+
prev = -1
66+
valid = True
67+
for x in words:
68+
curr = -1 if i >= len(x) else m[x[i]]
69+
if prev > curr:
7270
return False
73-
if i1 < i2:
74-
# 说明当前两单词是按字典序排序,无需再往下进行循环比较
75-
break
71+
if prev == curr:
72+
valid = False
73+
prev = curr
74+
if valid:
75+
return True
7676
return True
7777
```
7878

@@ -83,25 +83,25 @@ class Solution:
8383
```java
8484
class Solution {
8585
public boolean isAlienSorted(String[] words, String order) {
86-
int[] index = new int[26];
87-
for (int i = 0; i < index.length; ++i) {
88-
index[order.charAt(i) - 'a'] = i;
86+
int[] m = new int[26];
87+
for (int i = 0; i < 26; ++i) {
88+
m[order.charAt(i) - 'a'] = i;
8989
}
90-
for (int i = 0; i < words.length - 1; ++i) {
91-
String w1 = words[i];
92-
String w2 = words[i + 1];
93-
int l1 = w1.length(), l2 = w2.length();
94-
for (int j = 0; j < Math.max(l1, l2); ++j) {
95-
int i1 = j >= l1 ? -1 : index[w1.charAt(j) - 'a'];
96-
int i2 = j >= l2 ? -1 : index[w2.charAt(j) - 'a'];
97-
if (i1 > i2) {
98-
// 说明不是按字典序排序,直接返回False
90+
for (int i = 0; i < 20; ++i) {
91+
int prev = -1;
92+
boolean valid = true;
93+
for (String x : words) {
94+
int curr = i >= x.length() ? -1 : m[x.charAt(i) - 'a'];
95+
if (prev > curr) {
9996
return false;
10097
}
101-
if (i1 < i2) {
102-
// 说明当前两单词是按字典序排序,无需再往下进行循环比较
103-
break;
98+
if (prev == curr) {
99+
valid = false;
104100
}
101+
prev = curr;
102+
}
103+
if (valid) {
104+
break;
105105
}
106106
}
107107
return true;
@@ -114,24 +114,21 @@ class Solution {
114114
```cpp
115115
class Solution {
116116
public:
117-
bool isAlienSorted(vector<string> &words, string order) {
118-
vector<int> index(26);
119-
for (int i = 0; i < index.size(); ++i)
120-
index[order[i] - 'a'] = i;
121-
for (int i = 0; i < words.size() - 1; ++i)
117+
bool isAlienSorted(vector<string>& words, string order) {
118+
vector<int> m(26);
119+
for (int i = 0; i < 26; ++i) m[order[i] - 'a'] = i;
120+
for (int i = 0; i < 20; ++i)
122121
{
123-
string w1 = words[i];
124-
string w2 = words[i + 1];
125-
int l1 = w1.size(), l2 = w2.size();
126-
for (int j = 0; j < max(l1, l2); ++j)
122+
int prev = -1;
123+
bool valid = true;
124+
for (auto& x : words)
127125
{
128-
int i1 = j >= l1 ? -1 : index[w1[j] - 'a'];
129-
int i2 = j >= l2 ? -1 : index[w2[j] - 'a'];
130-
if (i1 > i2)
131-
return false;
132-
if (i1 < i2)
133-
break;
126+
int curr = i >= x.size() ? -1 : m[x[i] - 'a'];
127+
if (prev > curr) return false;
128+
if (prev == curr) valid = false;
129+
prev = curr;
134130
}
131+
if (valid) break;
135132
}
136133
return true;
137134
}
@@ -142,36 +139,32 @@ public:
142139
143140
```go
144141
func isAlienSorted(words []string, order string) bool {
145-
index := make(map[byte]int)
146-
for i := range order {
147-
index[order[i]] = i
142+
m := make([]int, 26)
143+
for i, c := range order {
144+
m[c-'a'] = i
148145
}
149-
for i := 0; i < len(words)-1; i++ {
150-
w1, w2 := words[i], words[i+1]
151-
l1, l2 := len(w1), len(w2)
152-
flag := true
153-
for j := 0; j < min(l1, l2) && flag; j++ {
154-
i1, i2 := index[w1[j]], index[w2[j]]
155-
if i1 > i2 {
146+
for i := 0; i < 20; i++ {
147+
prev := -1
148+
valid := true
149+
for _, x := range words {
150+
curr := -1
151+
if i < len(x) {
152+
curr = m[x[i]-'a']
153+
}
154+
if prev > curr {
156155
return false
157156
}
158-
if i1 < i2 {
159-
flag = false
157+
if prev == curr {
158+
valid = false
160159
}
160+
prev = curr
161161
}
162-
if flag && l1 > l2 {
163-
return false
162+
if valid {
163+
break
164164
}
165165
}
166166
return true
167167
}
168-
169-
func min(a, b int) int {
170-
if a < b {
171-
return a
172-
}
173-
return b
174-
}
175168
```
176169

177170
### **Rust**

solution/0900-0999/0953.Verifying an Alien Dictionary/README_EN.md

+56-59
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,19 @@
5252
```python
5353
class Solution:
5454
def isAlienSorted(self, words: List[str], order: str) -> bool:
55-
index = {c: i for i, c in enumerate(order)}
56-
for i in range(len(words) - 1):
57-
w1, w2 = words[i], words[i + 1]
58-
l1, l2 = len(w1), len(w2)
59-
flag = False
60-
for j in range(max(l1, l2)):
61-
i1, i2 = -1 if j >= l1 else index[w1[j]], -1 if j >= l2 else index[w2[j]]
62-
if i1 > i2:
55+
m = {c: i for i, c in enumerate(order)}
56+
for i in range(20):
57+
prev = -1
58+
valid = True
59+
for x in words:
60+
curr = -1 if i >= len(x) else m[x[i]]
61+
if prev > curr:
6362
return False
64-
if i1 < i2:
65-
break
63+
if prev == curr:
64+
valid = False
65+
prev = curr
66+
if valid:
67+
return True
6668
return True
6769
```
6870

@@ -71,23 +73,25 @@ class Solution:
7173
```java
7274
class Solution {
7375
public boolean isAlienSorted(String[] words, String order) {
74-
int[] index = new int[26];
75-
for (int i = 0; i < index.length; ++i) {
76-
index[order.charAt(i) - 'a'] = i;
76+
int[] m = new int[26];
77+
for (int i = 0; i < 26; ++i) {
78+
m[order.charAt(i) - 'a'] = i;
7779
}
78-
for (int i = 0; i < words.length - 1; ++i) {
79-
String w1 = words[i];
80-
String w2 = words[i + 1];
81-
int l1 = w1.length(), l2 = w2.length();
82-
for (int j = 0; j < Math.max(l1, l2); ++j) {
83-
int i1 = j >= l1 ? -1 : index[w1.charAt(j) - 'a'];
84-
int i2 = j >= l2 ? -1 : index[w2.charAt(j) - 'a'];
85-
if (i1 > i2) {
80+
for (int i = 0; i < 20; ++i) {
81+
int prev = -1;
82+
boolean valid = true;
83+
for (String x : words) {
84+
int curr = i >= x.length() ? -1 : m[x.charAt(i) - 'a'];
85+
if (prev > curr) {
8686
return false;
8787
}
88-
if (i1 < i2) {
89-
break;
88+
if (prev == curr) {
89+
valid = false;
9090
}
91+
prev = curr;
92+
}
93+
if (valid) {
94+
break;
9195
}
9296
}
9397
return true;
@@ -100,24 +104,21 @@ class Solution {
100104
```cpp
101105
class Solution {
102106
public:
103-
bool isAlienSorted(vector<string> &words, string order) {
104-
vector<int> index(26);
105-
for (int i = 0; i < index.size(); ++i)
106-
index[order[i] - 'a'] = i;
107-
for (int i = 0; i < words.size() - 1; ++i)
107+
bool isAlienSorted(vector<string>& words, string order) {
108+
vector<int> m(26);
109+
for (int i = 0; i < 26; ++i) m[order[i] - 'a'] = i;
110+
for (int i = 0; i < 20; ++i)
108111
{
109-
string w1 = words[i];
110-
string w2 = words[i + 1];
111-
int l1 = w1.size(), l2 = w2.size();
112-
for (int j = 0; j < max(l1, l2); ++j)
112+
int prev = -1;
113+
bool valid = true;
114+
for (auto& x : words)
113115
{
114-
int i1 = j >= l1 ? -1 : index[w1[j] - 'a'];
115-
int i2 = j >= l2 ? -1 : index[w2[j] - 'a'];
116-
if (i1 > i2)
117-
return false;
118-
if (i1 < i2)
119-
break;
116+
int curr = i >= x.size() ? -1 : m[x[i] - 'a'];
117+
if (prev > curr) return false;
118+
if (prev == curr) valid = false;
119+
prev = curr;
120120
}
121+
if (valid) break;
121122
}
122123
return true;
123124
}
@@ -128,36 +129,32 @@ public:
128129
129130
```go
130131
func isAlienSorted(words []string, order string) bool {
131-
index := make(map[byte]int)
132-
for i := range order {
133-
index[order[i]] = i
132+
m := make([]int, 26)
133+
for i, c := range order {
134+
m[c-'a'] = i
134135
}
135-
for i := 0; i < len(words)-1; i++ {
136-
w1, w2 := words[i], words[i+1]
137-
l1, l2 := len(w1), len(w2)
138-
flag := true
139-
for j := 0; j < min(l1, l2) && flag; j++ {
140-
i1, i2 := index[w1[j]], index[w2[j]]
141-
if i1 > i2 {
136+
for i := 0; i < 20; i++ {
137+
prev := -1
138+
valid := true
139+
for _, x := range words {
140+
curr := -1
141+
if i < len(x) {
142+
curr = m[x[i]-'a']
143+
}
144+
if prev > curr {
142145
return false
143146
}
144-
if i1 < i2 {
145-
flag = false
147+
if prev == curr {
148+
valid = false
146149
}
150+
prev = curr
147151
}
148-
if flag && l1 > l2 {
149-
return false
152+
if valid {
153+
break
150154
}
151155
}
152156
return true
153157
}
154-
155-
func min(a, b int) int {
156-
if a < b {
157-
return a
158-
}
159-
return b
160-
}
161158
```
162159

163160
### **Rust**

solution/0900-0999/0953.Verifying an Alien Dictionary/Solution.cpp

+12-15
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
11
class Solution {
22
public:
3-
bool isAlienSorted(vector<string> &words, string order) {
4-
vector<int> index(26);
5-
for (int i = 0; i < index.size(); ++i)
6-
index[order[i] - 'a'] = i;
7-
for (int i = 0; i < words.size() - 1; ++i)
3+
bool isAlienSorted(vector<string>& words, string order) {
4+
vector<int> m(26);
5+
for (int i = 0; i < 26; ++i) m[order[i] - 'a'] = i;
6+
for (int i = 0; i < 20; ++i)
87
{
9-
string w1 = words[i];
10-
string w2 = words[i + 1];
11-
int l1 = w1.size(), l2 = w2.size();
12-
for (int j = 0; j < max(l1, l2); ++j)
8+
int prev = -1;
9+
bool valid = true;
10+
for (auto& x : words)
1311
{
14-
int i1 = j >= l1 ? -1 : index[w1[j] - 'a'];
15-
int i2 = j >= l2 ? -1 : index[w2[j] - 'a'];
16-
if (i1 > i2)
17-
return false;
18-
if (i1 < i2)
19-
break;
12+
int curr = i >= x.size() ? -1 : m[x[i] - 'a'];
13+
if (prev > curr) return false;
14+
if (prev == curr) valid = false;
15+
prev = curr;
2016
}
17+
if (valid) break;
2118
}
2219
return true;
2320
}

0 commit comments

Comments
 (0)