Skip to content

Commit 9ccb348

Browse files
committed
feat: add solutions to lc problem: No.1662
No.1662.Check If Two String Arrays are Equivalent
1 parent 45c0727 commit 9ccb348

File tree

12 files changed

+275
-79
lines changed

12 files changed

+275
-79
lines changed

solution/0400-0499/0481.Magical String/README.md

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
i
6060
```
6161

62-
指向 $i$ 的数字为 $2$,表示第三组的数字会出现两次,并且,由于前一组数字为 $2$,组之间数字交替出现,因此第三组数字为两个 $1$,即 $11$。构造后,指针 $i$ 移动到下一个位置,即指向字符串 $s$ 的第四个数字 $1$。
62+
指针 $i$ 指向的数字为 $2$,表示第三组的数字会出现两次,并且,由于前一组数字为 $2$,组之间数字交替出现,因此第三组数字为两个 $1$,即 $11$。构造后,指针 $i$ 移动到下一个位置,即指向字符串 $s$ 的第四个数字 $1$。
6363

6464
```
6565
1 2 2 1 1
@@ -107,18 +107,16 @@ class Solution:
107107
class Solution {
108108
public int magicalString(int n) {
109109
List<Integer> s = new ArrayList<>(Arrays.asList(1, 2, 2));
110-
int i = 2;
111-
while (s.size() < n) {
110+
for (int i = 2; s.size() < n; ++i) {
112111
int pre = s.get(s.size() - 1);
113112
int cur = 3 - pre;
114113
for (int j = 0; j < s.get(i); ++j) {
115114
s.add(cur);
116115
}
117-
++i;
118116
}
119117
int ans = 0;
120-
for (int j = 0; j < n; ++j) {
121-
if (s.get(j) == 1) {
118+
for (int i = 0; i < n; ++i) {
119+
if (s.get(i) == 1) {
122120
++ans;
123121
}
124122
}
@@ -134,14 +132,12 @@ class Solution {
134132
public:
135133
int magicalString(int n) {
136134
vector<int> s = {1, 2, 2};
137-
int i = 2;
138-
while (s.size() < n) {
135+
for (int i = 2; s.size() < n; ++i) {
139136
int pre = s.back();
140137
int cur = 3 - pre;
141138
for (int j = 0; j < s[i]; ++j) {
142139
s.emplace_back(cur);
143140
}
144-
++i;
145141
}
146142
return count(s.begin(), s.begin() + n, 1);
147143
}
@@ -153,17 +149,15 @@ public:
153149
```go
154150
func magicalString(n int) (ans int) {
155151
s := []int{1, 2, 2}
156-
i := 2
157-
for len(s) < n {
152+
for i := 2; len(s) < n; i++ {
158153
pre := s[len(s)-1]
159154
cur := 3 - pre
160155
for j := 0; j < s[i]; j++ {
161156
s = append(s, cur)
162157
}
163-
i++
164158
}
165-
for j := 0; j < n; j++ {
166-
if s[j] == 1 {
159+
for _, c := range s[:n] {
160+
if c == 1 {
167161
ans++
168162
}
169163
}

solution/0400-0499/0481.Magical String/README_EN.md

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -62,18 +62,16 @@ class Solution:
6262
class Solution {
6363
public int magicalString(int n) {
6464
List<Integer> s = new ArrayList<>(Arrays.asList(1, 2, 2));
65-
int i = 2;
66-
while (s.size() < n) {
65+
for (int i = 2; s.size() < n; ++i) {
6766
int pre = s.get(s.size() - 1);
6867
int cur = 3 - pre;
6968
for (int j = 0; j < s.get(i); ++j) {
7069
s.add(cur);
7170
}
72-
++i;
7371
}
7472
int ans = 0;
75-
for (int j = 0; j < n; ++j) {
76-
if (s.get(j) == 1) {
73+
for (int i = 0; i < n; ++i) {
74+
if (s.get(i) == 1) {
7775
++ans;
7876
}
7977
}
@@ -89,14 +87,12 @@ class Solution {
8987
public:
9088
int magicalString(int n) {
9189
vector<int> s = {1, 2, 2};
92-
int i = 2;
93-
while (s.size() < n) {
90+
for (int i = 2; s.size() < n; ++i) {
9491
int pre = s.back();
9592
int cur = 3 - pre;
9693
for (int j = 0; j < s[i]; ++j) {
9794
s.emplace_back(cur);
9895
}
99-
++i;
10096
}
10197
return count(s.begin(), s.begin() + n, 1);
10298
}
@@ -108,17 +104,15 @@ public:
108104
```go
109105
func magicalString(n int) (ans int) {
110106
s := []int{1, 2, 2}
111-
i := 2
112-
for len(s) < n {
107+
for i := 2; len(s) < n; i++ {
113108
pre := s[len(s)-1]
114109
cur := 3 - pre
115110
for j := 0; j < s[i]; j++ {
116111
s = append(s, cur)
117112
}
118-
i++
119113
}
120-
for j := 0; j < n; j++ {
121-
if s[j] == 1 {
114+
for _, c := range s[:n] {
115+
if c == 1 {
122116
ans++
123117
}
124118
}

solution/0400-0499/0481.Magical String/Solution.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,12 @@ class Solution {
22
public:
33
int magicalString(int n) {
44
vector<int> s = {1, 2, 2};
5-
int i = 2;
6-
while (s.size() < n) {
5+
for (int i = 2; s.size() < n; ++i) {
76
int pre = s.back();
87
int cur = 3 - pre;
98
for (int j = 0; j < s[i]; ++j) {
109
s.emplace_back(cur);
1110
}
12-
++i;
1311
}
1412
return count(s.begin(), s.begin() + n, 1);
1513
}

solution/0400-0499/0481.Magical String/Solution.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
func magicalString(n int) (ans int) {
22
s := []int{1, 2, 2}
3-
i := 2
4-
for len(s) < n {
3+
for i := 2; len(s) < n; i++ {
54
pre := s[len(s)-1]
65
cur := 3 - pre
76
for j := 0; j < s[i]; j++ {
87
s = append(s, cur)
98
}
10-
i++
119
}
12-
for j := 0; j < n; j++ {
13-
if s[j] == 1 {
10+
for _, c := range s[:n] {
11+
if c == 1 {
1412
ans++
1513
}
1614
}

solution/0400-0499/0481.Magical String/Solution.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
class Solution {
22
public int magicalString(int n) {
33
List<Integer> s = new ArrayList<>(Arrays.asList(1, 2, 2));
4-
int i = 2;
5-
while (s.size() < n) {
4+
for (int i = 2; s.size() < n; ++i) {
65
int pre = s.get(s.size() - 1);
76
int cur = 3 - pre;
87
for (int j = 0; j < s.get(i); ++j) {
98
s.add(cur);
109
}
11-
++i;
1210
}
1311
int ans = 0;
14-
for (int j = 0; j < n; ++j) {
15-
if (s.get(j) == 1) {
12+
for (int i = 0; i < n; ++i) {
13+
if (s.get(i) == 1) {
1614
++ans;
1715
}
1816
}

solution/1600-1699/1662.Check If Two String Arrays are Equivalent/README.md

Lines changed: 129 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,23 @@ word2 表示的字符串为 "a" + "bc" -> "abc"
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54-
字符串拼接,比较。
54+
**方法一:字符串拼接**
55+
56+
将两个数组中的字符串拼接成两个字符串,然后比较两个字符串是否相等。
57+
58+
时间复杂度 $O(m)$,空间复杂度 $O(m)$。其中 $m$ 为数组中字符串的总长度。
59+
60+
**方法二:直接遍历**
61+
62+
方法一中,我们是将两个数组中的字符串拼接成两个新的字符串,有额外的空间开销。我们也可以直接遍历两个数组,逐个字符比较。
63+
64+
我们使用两个指针 $i$ 和 $j$ 分别指向两个字符串数组,用另外两个指针 $x$ 和 $y$ 分别指向字符串对应的字符。初始时,$i = j = x = y = 0$。
65+
66+
每次比较 $word1[i][x]$ 和 $word2[j][y]$,如果不相等,直接返回 `false`。否则,将 $x$ 和 $y$ 分别加一,如果 $x$ 或 $y$ 超出了对应的字符串的长度,将对应的字符串指针 $i$ 或 $j$ 加一,然后将 $x$ 和 $y$ 重置为 0。
67+
68+
如果两个字符串数组遍历完毕,返回 `true`,否则返回 `false`
69+
70+
时间复杂度 $O(m)$,空间复杂度 $O(1)$。其中 $m$ 为数组中字符串的总长度。
5571

5672
<!-- tabs:start -->
5773

@@ -62,8 +78,22 @@ word2 表示的字符串为 "a" + "bc" -> "abc"
6278
```python
6379
class Solution:
6480
def arrayStringsAreEqual(self, word1: List[str], word2: List[str]) -> bool:
65-
s1, s2 = ''.join(word1), ''.join(word2)
66-
return s1 == s2
81+
return ''.join(word1) == ''.join(word2)
82+
```
83+
84+
```python
85+
class Solution:
86+
def arrayStringsAreEqual(self, word1: List[str], word2: List[str]) -> bool:
87+
i = j = x = y = 0
88+
while i < len(word1) and j < len(word2):
89+
if word1[i][x] != word2[j][y]:
90+
return False
91+
x, y = x + 1, y + 1
92+
if x == len(word1[i]):
93+
x, i = 0, i + 1
94+
if y == len(word2[j]):
95+
y, j = 0, j + 1
96+
return i == len(word1) and j == len(word2)
6797
```
6898

6999
### **Java**
@@ -73,26 +103,112 @@ class Solution:
73103
```java
74104
class Solution {
75105
public boolean arrayStringsAreEqual(String[] word1, String[] word2) {
76-
StringBuilder s1 = new StringBuilder();
77-
StringBuilder s2 = new StringBuilder();
78-
for (String word : word1) {
79-
s1.append(word);
106+
return String.join("", word1).equals(String.join("", word2));
107+
}
108+
}
109+
```
110+
111+
```java
112+
class Solution {
113+
public boolean arrayStringsAreEqual(String[] word1, String[] word2) {
114+
int i = 0, j = 0;
115+
int x = 0, y = 0;
116+
while (i < word1.length && j < word2.length) {
117+
if (word1[i].charAt(x++) != word2[j].charAt(y++)) {
118+
return false;
119+
}
120+
if (x == word1[i].length()) {
121+
x = 0;
122+
++i;
123+
}
124+
if (y == word2[j].length()) {
125+
y = 0;
126+
++j;
127+
}
80128
}
81-
for (String word : word2) {
82-
s2.append(word);
129+
return i == word1.length && j == word2.length;
130+
}
131+
}
132+
```
133+
134+
### **C++**
135+
136+
```cpp
137+
class Solution {
138+
public:
139+
bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {
140+
return reduce(word1.cbegin(), word1.cend()) == reduce(word2.cbegin(), word2.cend());
141+
}
142+
};
143+
```
144+
145+
```cpp
146+
class Solution {
147+
public:
148+
bool arrayStringsAreEqual(vector<string>& word1, vector<string>& word2) {
149+
int i = 0, j = 0, x = 0, y = 0;
150+
while (i < word1.size() && j < word2.size()) {
151+
if (word1[i][x++] != word2[j][y++]) return false;
152+
if (x == word1[i].size()) x = 0, i++;
153+
if (y == word2[j].size()) y = 0, j++;
83154
}
84-
return Objects.equals(s1.toString(), s2.toString());
155+
return i == word1.size() && j == word2.size();
85156
}
157+
};
158+
```
159+
160+
### **Go**
161+
162+
```go
163+
func arrayStringsAreEqual(word1 []string, word2 []string) bool {
164+
return strings.Join(word1, "") == strings.Join(word2, "")
165+
}
166+
```
167+
168+
```go
169+
func arrayStringsAreEqual(word1 []string, word2 []string) bool {
170+
var i, j, x, y int
171+
for i < len(word1) && j < len(word2) {
172+
if word1[i][x] != word2[j][y] {
173+
return false
174+
}
175+
x, y = x+1, y+1
176+
if x == len(word1[i]) {
177+
x, i = 0, i+1
178+
}
179+
if y == len(word2[j]) {
180+
y, j = 0, j+1
181+
}
182+
}
183+
return i == len(word1) && j == len(word2)
86184
}
87185
```
88186

89187
### **TypeScript**
90188

91189
```ts
92190
function arrayStringsAreEqual(word1: string[], word2: string[]): boolean {
93-
let s1 = word1.join(''),
94-
s2 = word2.join('');
95-
return s1 == s2;
191+
return word1.join('') == word2.join('');
192+
}
193+
```
194+
195+
```ts
196+
function arrayStringsAreEqual(word1: string[], word2: string[]): boolean {
197+
let [i, j, x, y] = [0, 0, 0, 0];
198+
while (i < word1.length && j < word2.length) {
199+
if (word1[i][x++] != word2[j][y++]) {
200+
return false;
201+
}
202+
if (x == word1[i].length) {
203+
x = 0;
204+
++i;
205+
}
206+
if (y == word2[j].length) {
207+
y = 0;
208+
++j;
209+
}
210+
}
211+
return i == word1.length && j == word2.length;
96212
}
97213
```
98214

0 commit comments

Comments
 (0)