Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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:= ranges[: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)

AltStyle によって変換されたページ (->オリジナル) /