Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 122 additions & 4 deletions solution/3700-3799/3758.Convert Number Words to Digits/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,32 +103,150 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3700-3799/3758.Co

<!-- solution:start -->

### 方法一
### 方法一:枚举

我们首先将数字单词与对应的数字建立映射关系,记录在数组 $d$ 中,其中 $d[i]$ 表示数字 $i$ 对应的单词。

然后我们从左到右遍历字符串 $s$,对于每个位置 $i$,我们依次枚举数字单词 $d[j]$,判断从位置 $i$ 开始的子串是否与 $d[j]$ 匹配。如果匹配成功,则将数字 $j$ 添加到结果中,并将位置 $i$ 向后移动 $|d[j]|$ 个位置。否则,将位置 $i$ 向后移动 1 个位置。

我们重复上述过程,直到遍历完整个字符串 $s$。最后将结果中的数字连接成字符串并返回。

时间复杂度 $O(n \times |d|)$,空间复杂度 $O(|d|)$,其中 $n$ 是字符串 $s$ 的长度,而 $|d|$ 是数字单词的数量。

<!-- tabs:start -->

#### Python3

```python

class Solution:
def convertNumber(self, s: str) -> str:
d = [
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
]
i, n = 0, len(s)
ans = []
while i < n:
for j, t in enumerate(d):
m = len(t)
if i + m <= n and s[i : i + m] == t:
ans.append(str(j))
i += m - 1
break
i += 1
return "".join(ans)
```

#### Java

```java

class Solution {
public String convertNumber(String s) {
String[] d
= {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int n = s.length();
StringBuilder ans = new StringBuilder();
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d.length; ++j) {
String t = d[j];
int m = t.length();
if (i + m <= n && s.substring(i, i + m).equals(t)) {
ans.append(j);
i += m - 1;
break;
}
}
}
return ans.toString();
}
}
```

#### C++

```cpp

class Solution {
public:
string convertNumber(string s) {
vector<string> d = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int n = s.length();
string ans;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d.size(); ++j) {
string t = d[j];
int m = t.length();
if (i + m <= n && s.substr(i, m) == t) {
ans += to_string(j);
i += m - 1;
break;
}
}
}
return ans;
}
};
```

#### Go

```go
func convertNumber(s string) string {
d := []string{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}
n := len(s)
var ans strings.Builder
for i := 0; i < n; i++ {
for j, t := range d {
m := len(t)
if i+m <= n && s[i:i+m] == t {
ans.WriteString(strconv.Itoa(j))
i += m - 1
break
}
}
}
return ans.String()
}
```

#### TypeScript

```ts
function convertNumber(s: string): string {
const d: string[] = [
'zero',
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
];
const n = s.length;
const ans: string[] = [];
for (let i = 0; i < n; ++i) {
for (let j = 0; j < d.length; ++j) {
const t = d[j];
const m = t.length;
if (i + m <= n && s.substring(i, i + m) === t) {
ans.push(j.toString());
i += m - 1;
break;
}
}
}
return ans.join('');
}
```

<!-- tabs:end -->
Expand Down
126 changes: 122 additions & 4 deletions solution/3700-3799/3758.Convert Number Words to Digits/README_EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,32 +103,150 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3700-3799/3758.Co

<!-- solution:start -->

### Solution 1
### Solution 1: Enumeration

We first establish a mapping relationship between number words and their corresponding digits, recorded in array $d$, where $d[i]$ represents the word corresponding to digit $i$.

Then we traverse the string $s$ from left to right. For each position $i$, we enumerate the number words $d[j]$ in order and check whether the substring starting from position $i$ matches $d[j]$. If a match is found, we add digit $j$ to the result and move position $i$ forward by $|d[j]|$ positions. Otherwise, we move position $i$ forward by 1 position.

We repeat this process until we have traversed the entire string $s$. Finally, we concatenate the digits in the result into a string and return it.

The time complexity is $O(n \times |d|)$ and the space complexity is $O(|d|)$, where $n$ is the length of string $s$ and $|d|$ is the number of digit words.

<!-- tabs:start -->

#### Python3

```python

class Solution:
def convertNumber(self, s: str) -> str:
d = [
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
]
i, n = 0, len(s)
ans = []
while i < n:
for j, t in enumerate(d):
m = len(t)
if i + m <= n and s[i : i + m] == t:
ans.append(str(j))
i += m - 1
break
i += 1
return "".join(ans)
```

#### Java

```java

class Solution {
public String convertNumber(String s) {
String[] d
= {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int n = s.length();
StringBuilder ans = new StringBuilder();
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d.length; ++j) {
String t = d[j];
int m = t.length();
if (i + m <= n && s.substring(i, i + m).equals(t)) {
ans.append(j);
i += m - 1;
break;
}
}
}
return ans.toString();
}
}
```

#### C++

```cpp

class Solution {
public:
string convertNumber(string s) {
vector<string> d = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int n = s.length();
string ans;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d.size(); ++j) {
string t = d[j];
int m = t.length();
if (i + m <= n && s.substr(i, m) == t) {
ans += to_string(j);
i += m - 1;
break;
}
}
}
return ans;
}
};
```

#### Go

```go
func convertNumber(s string) string {
d := []string{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}
n := len(s)
var ans strings.Builder
for i := 0; i < n; i++ {
for j, t := range d {
m := len(t)
if i+m <= n && s[i:i+m] == t {
ans.WriteString(strconv.Itoa(j))
i += m - 1
break
}
}
}
return ans.String()
}
```

#### TypeScript

```ts
function convertNumber(s: string): string {
const d: string[] = [
'zero',
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine',
];
const n = s.length;
const ans: string[] = [];
for (let i = 0; i < n; ++i) {
for (let j = 0; j < d.length; ++j) {
const t = d[j];
const m = t.length;
if (i + m <= n && s.substring(i, i + m) === t) {
ans.push(j.toString());
i += m - 1;
break;
}
}
}
return ans.join('');
}
```

<!-- tabs:end -->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
class Solution {
public:
string convertNumber(string s) {
vector<string> d = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int n = s.length();
string ans;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d.size(); ++j) {
string t = d[j];
int m = t.length();
if (i + m <= n && s.substr(i, m) == t) {
ans += to_string(j);
i += m - 1;
break;
}
}
}
return ans;
}
};
16 changes: 16 additions & 0 deletions solution/3700-3799/3758.Convert Number Words to Digits/Solution.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
func convertNumber(s string) string {
d := []string{"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}
n := len(s)
var ans strings.Builder
for i := 0; i < n; i++ {
for j, t := range d {
m := len(t)
if i+m <= n && s[i:i+m] == t {
ans.WriteString(strconv.Itoa(j))
i += m - 1
break
}
}
}
return ans.String()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
class Solution {
public String convertNumber(String s) {
String[] d
= {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
int n = s.length();
StringBuilder ans = new StringBuilder();
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d.length; ++j) {
String t = d[j];
int m = t.length();
if (i + m <= n && s.substring(i, i + m).equals(t)) {
ans.append(j);
i += m - 1;
break;
}
}
}
return ans.toString();
}
}
25 changes: 25 additions & 0 deletions solution/3700-3799/3758.Convert Number Words to Digits/Solution.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
class Solution:
def convertNumber(self, s: str) -> str:
d = [
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
]
i, n = 0, len(s)
ans = []
while i < n:
for j, t in enumerate(d):
m = len(t)
if i + m <= n and s[i : i + m] == t:
ans.append(str(j))
i += m - 1
break
i += 1
return "".join(ans)
Loading