From 0fd5f314c052dddfc295191f180350d6267b2d76 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Tue, 25 Nov 2025 07:21:06 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.3758 --- .../README.md | 126 +++++++++++++++++- .../README_EN.md | 126 +++++++++++++++++- .../Solution.cpp | 20 +++ .../Solution.go | 16 +++ .../Solution.java | 20 +++ .../Solution.py | 25 ++++ .../Solution.ts | 28 ++++ 7 files changed, 353 insertions(+), 8 deletions(-) create mode 100644 solution/3700-3799/3758.Convert Number Words to Digits/Solution.cpp create mode 100644 solution/3700-3799/3758.Convert Number Words to Digits/Solution.go create mode 100644 solution/3700-3799/3758.Convert Number Words to Digits/Solution.java create mode 100644 solution/3700-3799/3758.Convert Number Words to Digits/Solution.py create mode 100644 solution/3700-3799/3758.Convert Number Words to Digits/Solution.ts diff --git a/solution/3700-3799/3758.Convert Number Words to Digits/README.md b/solution/3700-3799/3758.Convert Number Words to Digits/README.md index 9ffd957e67c29..8aeeed30dbeab 100644 --- a/solution/3700-3799/3758.Convert Number Words to Digits/README.md +++ b/solution/3700-3799/3758.Convert Number Words to Digits/README.md @@ -103,32 +103,150 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3700-3799/3758.Co -### 方法一 +### 方法一:枚举 + +我们首先将数字单词与对应的数字建立映射关系,记录在数组 $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|$ 是数字单词的数量。 #### 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 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(''); +} ``` diff --git a/solution/3700-3799/3758.Convert Number Words to Digits/README_EN.md b/solution/3700-3799/3758.Convert Number Words to Digits/README_EN.md index f8a67291c279c..b04a6ee0eb68f 100644 --- a/solution/3700-3799/3758.Convert Number Words to Digits/README_EN.md +++ b/solution/3700-3799/3758.Convert Number Words to Digits/README_EN.md @@ -103,32 +103,150 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3700-3799/3758.Co -### 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. #### 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 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(''); +} ``` diff --git a/solution/3700-3799/3758.Convert Number Words to Digits/Solution.cpp b/solution/3700-3799/3758.Convert Number Words to Digits/Solution.cpp new file mode 100644 index 0000000000000..f28bb9b747c31 --- /dev/null +++ b/solution/3700-3799/3758.Convert Number Words to Digits/Solution.cpp @@ -0,0 +1,20 @@ +class Solution { +public: + string convertNumber(string s) { + vector 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; + } +}; diff --git a/solution/3700-3799/3758.Convert Number Words to Digits/Solution.go b/solution/3700-3799/3758.Convert Number Words to Digits/Solution.go new file mode 100644 index 0000000000000..3e1ce9928dc7d --- /dev/null +++ b/solution/3700-3799/3758.Convert Number Words to Digits/Solution.go @@ -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() +} diff --git a/solution/3700-3799/3758.Convert Number Words to Digits/Solution.java b/solution/3700-3799/3758.Convert Number Words to Digits/Solution.java new file mode 100644 index 0000000000000..4c782bd655f92 --- /dev/null +++ b/solution/3700-3799/3758.Convert Number Words to Digits/Solution.java @@ -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(); + } +} diff --git a/solution/3700-3799/3758.Convert Number Words to Digits/Solution.py b/solution/3700-3799/3758.Convert Number Words to Digits/Solution.py new file mode 100644 index 0000000000000..2421101afa69e --- /dev/null +++ b/solution/3700-3799/3758.Convert Number Words to Digits/Solution.py @@ -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) diff --git a/solution/3700-3799/3758.Convert Number Words to Digits/Solution.ts b/solution/3700-3799/3758.Convert Number Words to Digits/Solution.ts new file mode 100644 index 0000000000000..9e066391af6df --- /dev/null +++ b/solution/3700-3799/3758.Convert Number Words to Digits/Solution.ts @@ -0,0 +1,28 @@ +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(''); +}