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 b3c89d2

Browse files
feat: add solutions to lc problems: No.0408~0410 (#1977)
* No.0408.Valid Word Abbreviation * No.0409.Longest Palindrome * No.0410.Split Array Largest Sum
1 parent 61932c6 commit b3c89d2

File tree

10 files changed

+310
-264
lines changed

10 files changed

+310
-264
lines changed

‎solution/0400-0499/0408.Valid Word Abbreviation/README.md‎

Lines changed: 94 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,21 @@
6464

6565
**方法一:模拟**
6666

67-
模拟字符匹配替换
67+
我们可以直接模拟字符匹配替换
6868

69-
同时遍历 $word$ $abbr$,若 $abbr$ 遇到数字,则 $word$ 跳过对应数字长度的字符数。若数字为空,或者有前导零,则提前返回 false
69+
假设字符串 $word$ 和字符串 $abbr$ 的长度分别为 $m$ 和 $n,ドル我们使用两个指针 $i$ 和 $j$ 分别指向字符串 $word$ 和字符串 $abbr$ 的初始位置,用一个整型变量 $x$ 记录当前匹配到的 $abbr$ 的数字
7070

71-
时间复杂度 $O(m+n),ドル空间复杂度 $O(1)$。其中 $m$ 是 $word$ 的长度,而 $n$ 是 $abbr$ 的长度。
71+
循环匹配字符串 $word$ 和字符串 $abbr$ 的每个字符:
72+
73+
如果指针 $j$ 指向的字符 $abbr[j]$ 是数字,如果 $abbr[j]$ 是 `'0'`,并且 $x$ 为 0ドル,ドル说明 $abbr$ 中的数字含有前导零,因此不是合法的缩写,返回 `false`;否则将 $x$ 更新为 $x \times 10 + abbr[j] - '0'$。
74+
75+
如果指针 $j$ 指向的字符 $abbr[j]$ 不是数字,那么我们此时将指针 $i$ 往前移动 $x$ 个位置,然后将 $x$ 重置为 0ドル$。如果此时 $i \geq m$ 或者 $word[i] \neq abbr[j],ドル说明两个字符串无法匹配,返回 `false`;否则将指针 $i$ 往前移动 1ドル$ 个位置。
76+
77+
然后我们将指针 $j$ 往前移动 1ドル$ 个位置,重复上述过程,直到 $i$ 超出字符串 $word$ 的长度或者 $j$ 超出字符串 $abbr$ 的长度。
78+
79+
最后,如果 $i + x$ 等于 $m$ 且 $j$ 等于 $n,ドル说明字符串 $word$ 可以缩写成字符串 $abbr,ドル返回 `true`;否则返回 `false`
80+
81+
时间复杂度 $O(m + n),ドル其中 $m$ 和 $n$ 分别是字符串 $word$ 和字符串 $abbr$ 的长度。空间复杂度 $O(1)$。
7282

7383
<!-- tabs:start -->
7484

@@ -79,23 +89,21 @@
7989
```python
8090
class Solution:
8191
def validWordAbbreviation(self, word: str, abbr: str) -> bool:
82-
i = j = 0
8392
m, n = len(word), len(abbr)
84-
while i < m:
85-
if j >= n:
86-
return False
87-
if word[i] == abbr[j]:
88-
i, j = i + 1, j + 1
89-
continue
90-
k = j
91-
while k < n and abbr[k].isdigit():
92-
k += 1
93-
t = abbr[j:k]
94-
if not t.isdigit() or t[0] == '0' or int(t) == 0:
95-
return False
96-
i += int(t)
97-
j = k
98-
return i == m and j == n
93+
i = j = x = 0
94+
while i < m and j < n:
95+
if abbr[j].isdigit():
96+
if abbr[j] == "0" and x == 0:
97+
return False
98+
x = x * 10 + int(abbr[j])
99+
else:
100+
i += x
101+
x = 0
102+
if i >= m or word[i] != abbr[j]:
103+
return False
104+
i += 1
105+
j += 1
106+
return i + x == m and j == n
99107
```
100108

101109
### **Java**
@@ -106,28 +114,24 @@ class Solution:
106114
class Solution {
107115
public boolean validWordAbbreviation(String word, String abbr) {
108116
int m = word.length(), n = abbr.length();
109-
int i = 0, j = 0;
110-
while (i < m) {
111-
if (j >= n) {
112-
return false;
113-
}
114-
if (word.charAt(i) == abbr.charAt(j)) {
117+
int i = 0, j = 0, x = 0;
118+
for (; i < m && j < n; ++j) {
119+
char c = abbr.charAt(j);
120+
if (Character.isDigit(c)) {
121+
if (c == '0' && x == 0) {
122+
return false;
123+
}
124+
x = x * 10 + (c - '0');
125+
} else {
126+
i += x;
127+
x = 0;
128+
if (i >= m || word.charAt(i) != c) {
129+
return false;
130+
}
115131
++i;
116-
++j;
117-
continue;
118132
}
119-
int k = j;
120-
while (k < n && Character.isDigit(abbr.charAt(k))) {
121-
++k;
122-
}
123-
String t = abbr.substring(j, k);
124-
if (j == k || t.charAt(0) == '0' || Integer.parseInt(t) == 0) {
125-
return false;
126-
}
127-
i += Integer.parseInt(t);
128-
j = k;
129133
}
130-
return i == m && j == n;
134+
return i + x == m && j == n;
131135
}
132136
}
133137
```
@@ -138,33 +142,24 @@ class Solution {
138142
class Solution {
139143
public:
140144
bool validWordAbbreviation(string word, string abbr) {
141-
int i = 0, j = 0;
142145
int m = word.size(), n = abbr.size();
143-
while (i < m) {
144-
if (j >= n) {
145-
return false;
146-
}
147-
if (word[i] == abbr[j]) {
146+
int i = 0, j = 0, x = 0;
147+
for (; i < m && j < n; ++j) {
148+
if (isdigit(abbr[j])) {
149+
if (abbr[j] == '0' && x == 0) {
150+
return false;
151+
}
152+
x = x * 10 + (abbr[j] - '0');
153+
} else {
154+
i += x;
155+
x = 0;
156+
if (i >= m || word[i] != abbr[j]) {
157+
return false;
158+
}
148159
++i;
149-
++j;
150-
continue;
151-
}
152-
int k = j;
153-
while (k < n && isdigit(abbr[k])) {
154-
++k;
155-
}
156-
string t = abbr.substr(j, k - j);
157-
if (k == j || t[0] == '0') {
158-
return false;
159-
}
160-
int x = stoi(t);
161-
if (x == 0) {
162-
return false;
163160
}
164-
i += x;
165-
j = k;
166161
}
167-
return i == m && j == n;
162+
return i + x == m && j == n;
168163
}
169164
};
170165
```
@@ -173,32 +168,48 @@ public:
173168
174169
```go
175170
func validWordAbbreviation(word string, abbr string) bool {
176-
i, j := 0, 0
177171
m, n := len(word), len(abbr)
178-
for i < m {
179-
if j >= n {
180-
return false
181-
}
182-
if word[i] == abbr[j] {
172+
i, j, x := 0, 0, 0
173+
for ; i < m && j < n; j++ {
174+
if abbr[j] >= '0' && abbr[j] <= '9' {
175+
if x == 0 && abbr[j] == '0' {
176+
return false
177+
}
178+
x = x*10 + int(abbr[j]-'0')
179+
} else {
180+
i += x
181+
x = 0
182+
if i >= m || word[i] != abbr[j] {
183+
return false
184+
}
183185
i++
184-
j++
185-
continue
186-
}
187-
k := j
188-
for k < n && abbr[k] >= '0' && abbr[k] <= '9' {
189-
k++
190-
}
191-
if k == j || abbr[j] == '0' {
192-
return false
193186
}
194-
x, _ := strconv.Atoi(abbr[j:k])
195-
if x == 0 {
196-
return false
197-
}
198-
i += x
199-
j = k
200187
}
201-
return i == m && j == n
188+
return i+x == m && j == n
189+
}
190+
```
191+
192+
### **TypeScript**
193+
194+
```ts
195+
function validWordAbbreviation(word: string, abbr: string): boolean {
196+
const [m, n] = [word.length, abbr.length];
197+
let [i, j, x] = [0, 0, 0];
198+
for (; i < m && j < n; ++j) {
199+
if (abbr[j] >= '0' && abbr[j] <= '9') {
200+
if (abbr[j] === '0' && x === 0) {
201+
return false;
202+
}
203+
x = x * 10 + Number(abbr[j]);
204+
} else {
205+
i += x;
206+
x = 0;
207+
if (i >= m || word[i++] !== abbr[j]) {
208+
return false;
209+
}
210+
}
211+
}
212+
return i + x === m && j === n;
202213
}
203214
```
204215

0 commit comments

Comments
(0)

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