From 2010db04df1a76eabd419e9b69c27fc94e33031c Mon Sep 17 00:00:00 2001 From: yanglbme Date: Mon, 7 Aug 2023 09:14:48 +0800 Subject: [PATCH] feat: add solutions to lc problems: No.0344,0345 * No.0344.Reverse String * No.0345.Reverse Vowels of a String --- .../0300-0399/0344.Reverse String/README.md | 49 +++++-- .../0344.Reverse String/README_EN.md | 43 ++++-- .../0344.Reverse String/Solution.cpp | 13 +- .../0300-0399/0344.Reverse String/Solution.py | 12 +- .../0300-0399/0344.Reverse String/Solution.rs | 23 ++- .../0300-0399/0344.Reverse String/Solution.ts | 8 ++ .../0345.Reverse Vowels of a String/README.md | 131 ++++++++++++------ .../README_EN.md | 123 ++++++++++------ .../Solution.cpp | 23 +++ .../Solution.go | 32 ++--- .../Solution.java | 48 ++++--- .../Solution.py | 30 ++-- .../Solution.ts | 14 ++ 13 files changed, 365 insertions(+), 184 deletions(-) create mode 100644 solution/0300-0399/0344.Reverse String/Solution.ts create mode 100644 solution/0300-0399/0345.Reverse Vowels of a String/Solution.cpp create mode 100644 solution/0300-0399/0345.Reverse Vowels of a String/Solution.ts diff --git a/solution/0300-0399/0344.Reverse String/README.md b/solution/0300-0399/0344.Reverse String/README.md index 04a9a7e36ebae..0902153e74998 100644 --- a/solution/0300-0399/0344.Reverse String/README.md +++ b/solution/0300-0399/0344.Reverse String/README.md @@ -38,6 +38,12 @@ +**方法一:双指针** + +我们用两个指针 $i$ 和 $j$,初始时分别指向数组的首尾,每次将 $i$ 和 $j$ 对应的元素交换,然后 $i$ 向后移动,$j$ 向前移动,直到 $i$ 和 $j$ 相遇。 + +时间复杂度 $O(n)$,其中 $n$ 是数组的长度。空间复杂度 $O(1)$。 + ### **Python3** @@ -47,9 +53,15 @@ ```python class Solution: def reverseString(self, s: List[str]) -> None: - """ - Do not return anything, modify s in-place instead. - """ + i, j = 0, len(s) - 1 + while i < j: + s[i], s[j] = s[j], s[i] + i, j = i + 1, j - 1 +``` + +```python +class Solution: + def reverseString(self, s: List[str]) -> None: s[:] = s[::-1] ``` @@ -75,8 +87,9 @@ class Solution { class Solution { public: void reverseString(vector& s) { - for (int i = 0, j = s.size() - 1; i < j; ++i, --j) - swap(s[i], s[j]); + for (int i = 0, j = s.size() - 1; i < j;) { + swap(s[i++], s[j--]); + } } }; ``` @@ -91,6 +104,19 @@ func reverseString(s []byte) { } ``` +### **TypeScript** + +```ts +/** + Do not return anything, modify s in-place instead. + */ +function reverseString(s: string[]): void { + for (let i = 0, j = s.length - 1; i < j; ++i, --j) { + [s[i], s[j]] = [s[j], s[i]]; + } +} +``` + ### **JavaScript** ```js @@ -110,13 +136,12 @@ var reverseString = function (s) { ```rust impl Solution { pub fn reverse_string(s: &mut Vec) { - let n = s.len(); - let mut l = 0; - let mut r = n - 1; - while l < r { - s.swap(l, r); - l += 1; - r -= 1; + let mut i = 0; + let mut j = s.len() - 1; + while i < j { + s.swap(i, j); + i += 1; + j -= 1; } } } diff --git a/solution/0300-0399/0344.Reverse String/README_EN.md b/solution/0300-0399/0344.Reverse String/README_EN.md index 01b183f8bd015..4bd36a0e2cc88 100644 --- a/solution/0300-0399/0344.Reverse String/README_EN.md +++ b/solution/0300-0399/0344.Reverse String/README_EN.md @@ -33,9 +33,15 @@ ```python class Solution: def reverseString(self, s: List[str]) -> None: - """ - Do not return anything, modify s in-place instead. - """ + i, j = 0, len(s) - 1 + while i < j: + s[i], s[j] = s[j], s[i] + i, j = i + 1, j - 1 +``` + +```python +class Solution: + def reverseString(self, s: List[str]) -> None: s[:] = s[::-1] ``` @@ -59,8 +65,9 @@ class Solution { class Solution { public: void reverseString(vector& s) { - for (int i = 0, j = s.size() - 1; i < j; ++i, --j) - swap(s[i], s[j]); + for (int i = 0, j = s.size() - 1; i < j;) { + swap(s[i++], s[j--]); + } } }; ``` @@ -75,6 +82,19 @@ func reverseString(s []byte) { } ``` +### **TypeScript** + +```ts +/** + Do not return anything, modify s in-place instead. + */ +function reverseString(s: string[]): void { + for (let i = 0, j = s.length - 1; i < j; ++i, --j) { + [s[i], s[j]] = [s[j], s[i]]; + } +} +``` + ### **JavaScript** ```js @@ -94,13 +114,12 @@ var reverseString = function (s) { ```rust impl Solution { pub fn reverse_string(s: &mut Vec) { - let n = s.len(); - let mut l = 0; - let mut r = n - 1; - while l < r { - s.swap(l, r); - l += 1; - r -= 1; + let mut i = 0; + let mut j = s.len() - 1; + while i < j { + s.swap(i, j); + i += 1; + j -= 1; } } } diff --git a/solution/0300-0399/0344.Reverse String/Solution.cpp b/solution/0300-0399/0344.Reverse String/Solution.cpp index 4d2c10807bd04..7e401e2d65784 100644 --- a/solution/0300-0399/0344.Reverse String/Solution.cpp +++ b/solution/0300-0399/0344.Reverse String/Solution.cpp @@ -1,7 +1,8 @@ -class Solution { -public: - void reverseString(vector& s) { - for (int i = 0, j = s.size() - 1; i < j; ++i, --j) - swap(s[i], s[j]); - } +class Solution { +public: + void reverseString(vector& s) { + for (int i = 0, j = s.size() - 1; i < j;) { + swap(s[i++], s[j--]); + } + } }; \ No newline at end of file diff --git a/solution/0300-0399/0344.Reverse String/Solution.py b/solution/0300-0399/0344.Reverse String/Solution.py index 3c6a3fdaa1d08..18a47df1f4ed3 100644 --- a/solution/0300-0399/0344.Reverse String/Solution.py +++ b/solution/0300-0399/0344.Reverse String/Solution.py @@ -1,6 +1,6 @@ -class Solution: - def reverseString(self, s: List[str]) -> None: - """ - Do not return anything, modify s in-place instead. - """ - s[:] = s[::-1] +class Solution: + def reverseString(self, s: List[str]) -> None: + i, j = 0, len(s) - 1 + while i < j: + s[i], s[j] = s[j], s[i] + i, j = i + 1, j - 1 diff --git a/solution/0300-0399/0344.Reverse String/Solution.rs b/solution/0300-0399/0344.Reverse String/Solution.rs index c7cd8d5a12242..e68688a9645bb 100644 --- a/solution/0300-0399/0344.Reverse String/Solution.rs +++ b/solution/0300-0399/0344.Reverse String/Solution.rs @@ -1,12 +1,11 @@ -impl Solution { - pub fn reverse_string(s: &mut Vec) { - let n = s.len(); - let mut l = 0; - let mut r = n - 1; - while l < r { - s.swap(l, r); - l += 1; - r -= 1; - } - } -} +impl Solution { + pub fn reverse_string(s: &mut Vec) { + let mut i = 0; + let mut j = s.len() - 1; + while i < j { + s.swap(i, j); + i += 1; + j -= 1; + } + } +} diff --git a/solution/0300-0399/0344.Reverse String/Solution.ts b/solution/0300-0399/0344.Reverse String/Solution.ts new file mode 100644 index 0000000000000..d11f6f4207316 --- /dev/null +++ b/solution/0300-0399/0344.Reverse String/Solution.ts @@ -0,0 +1,8 @@ +/** + Do not return anything, modify s in-place instead. + */ +function reverseString(s: string[]): void { + for (let i = 0, j = s.length - 1; i < j; ++i, --j) { + [s[i], s[j]] = [s[j], s[i]]; + } +} diff --git a/solution/0300-0399/0345.Reverse Vowels of a String/README.md b/solution/0300-0399/0345.Reverse Vowels of a String/README.md index f4c4738935b29..ea02c5f686202 100644 --- a/solution/0300-0399/0345.Reverse Vowels of a String/README.md +++ b/solution/0300-0399/0345.Reverse Vowels of a String/README.md @@ -38,9 +38,13 @@ -将字符串转为字符数组(或列表),定义双指针 i、j,分别指向数组(列表)头部和尾部,当 i、j 指向的字符均为元音字母时,进行交换。 +**方法一:双指针** -依次遍历,当 `i >= j` 时,遍历结束。将字符数组(列表)转为字符串返回即可。 +我们可以用两个指针 $i$ 和 $j$,初始时分别指向字符串的首尾。 + +每次循环判断 $i$ 指向的字符是否是元音字母,如果不是则向后移动 $i$;同理,判断 $j$ 指向的字符是否是元音字母,如果不是则向前移动 $j$。如果此时 $i \lt j$,那么 $i$ 和 $j$ 指向的字符都是元音字母,交换这两个字符。然后向后移动 $i$,向前移动 $j$。继续上述操作,直到 $i \ge j$。 + +时间复杂度 $O(n)$,其中 $n$ 是字符串的长度。空间复杂度 $O(|\Sigma|)$,其中 $\Sigma$ 是字符集的大小。 @@ -51,20 +55,18 @@ ```python class Solution: def reverseVowels(self, s: str) -> str: - vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'} + vowels = "aeiouAEIOU" i, j = 0, len(s) - 1 - chars = list(s) + cs = list(s) while i < j: - if chars[i] not in vowels: + while i < j and cs[i] not in vowels: i += 1 - continue - if chars[j] not in vowels: + while i < j and cs[j] not in vowels: j -= 1 - continue - chars[i], chars[j] = chars[j], chars[i] - i += 1 - j -= 1 - return ''.join(chars) + if i < j: + cs[i], cs[j] = cs[j], cs[i] + i, j = i + 1, j - 1 + return "".join(cs) ``` ### **Java** @@ -74,55 +76,102 @@ class Solution: ```java class Solution { public String reverseVowels(String s) { - Set vowels - = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U')); - int i = 0, j = s.length() - 1; - char[] chars = s.toCharArray(); + boolean[] vowels = new boolean[128]; + for (char c : "aeiouAEIOU".toCharArray()) { + vowels[c] = true; + } + char[] cs = s.toCharArray(); + int i = 0, j = cs.length - 1; while (i < j) { - if (!vowels.contains(chars[i])) { + while (i < j && !vowels[cs[i]]) { ++i; - continue; } - if (!vowels.contains(chars[j])) { + while (i < j && !vowels[cs[j]]) { + --j; + } + if (i < j) { + char t = cs[i]; + cs[i] = cs[j]; + cs[j] = t; + ++i; --j; - continue; } - char t = chars[i]; - chars[i] = chars[j]; - chars[j] = t; - ++i; - --j; } - return new String(chars); + return String.valueOf(cs); } } ``` +### **C++** + +```cpp +class Solution { +public: + string reverseVowels(string s) { + bool vowels[128]; + memset(vowels, false, sizeof(vowels)); + for (char c : "aeiouAEIOU") { + vowels[c] = true; + } + int i = 0, j = s.size() - 1; + while (i < j) { + while (i < j && !vowels[s[i]]) { + ++i; + } + while (i < j && !vowels[s[j]]) { + --j; + } + if (i < j) { + swap(s[i++], s[j--]); + } + } + return s; + } +}; +``` + ### **Go** ```go func reverseVowels(s string) string { - left, right := 0, len(s)-1 - a := []byte(s) - for left < right { - for left < right && !isVowel(a[left]) { - left++ + vowels := [128]bool{} + for _, c := range "aeiouAEIOU" { + vowels[c] = true + } + cs := []byte(s) + i, j := 0, len(cs)-1 + for i < j { + for i < j && !vowels[cs[i]] { + i++ } - for left < right && !isVowel(a[right]) { - right-- + for i < j && !vowels[cs[j]] { + j-- } - if left != right && isVowel(a[left]) && isVowel(a[right]) { - a[left], a[right] = a[right], a[left] - left++ - right-- + if i < j { + cs[i], cs[j] = cs[j], cs[i] + i, j = i+1, j-1 } } - return string(a) + return string(cs) } +``` + +### **TypeScript** -func isVowel(b byte) bool { - return b == 'a' || b == 'e' || b == 'i' || b == 'o' || b == 'u' || - b == 'A' || b == 'E' || b == 'I' || b == 'O' || b == 'U' +```ts +function reverseVowels(s: string): string { + const vowels = new Set(['a', 'e', 'i', 'o', 'u']); + const cs = s.split(''); + for (let i = 0, j = cs.length - 1; i < j; ++i, --j) { + while (i < j && !vowels.has(cs[i].toLowerCase())) { + ++i; + } + while (i < j && !vowels.has(cs[j].toLowerCase())) { + --j; + } + [cs[i], cs[j]] = [cs[j], cs[i]]; + } + return cs.join(''); } ``` diff --git a/solution/0300-0399/0345.Reverse Vowels of a String/README_EN.md b/solution/0300-0399/0345.Reverse Vowels of a String/README_EN.md index 8e5a64b16a0d9..9ca513b50829f 100644 --- a/solution/0300-0399/0345.Reverse Vowels of a String/README_EN.md +++ b/solution/0300-0399/0345.Reverse Vowels of a String/README_EN.md @@ -33,20 +33,18 @@ ```python class Solution: def reverseVowels(self, s: str) -> str: - vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'} + vowels = "aeiouAEIOU" i, j = 0, len(s) - 1 - chars = list(s) + cs = list(s) while i < j: - if chars[i] not in vowels: + while i < j and cs[i] not in vowels: i += 1 - continue - if chars[j] not in vowels: + while i < j and cs[j] not in vowels: j -= 1 - continue - chars[i], chars[j] = chars[j], chars[i] - i += 1 - j -= 1 - return ''.join(chars) + if i < j: + cs[i], cs[j] = cs[j], cs[i] + i, j = i + 1, j - 1 + return "".join(cs) ``` ### **Java** @@ -54,55 +52,102 @@ class Solution: ```java class Solution { public String reverseVowels(String s) { - Set vowels - = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U')); - int i = 0, j = s.length() - 1; - char[] chars = s.toCharArray(); + boolean[] vowels = new boolean[128]; + for (char c : "aeiouAEIOU".toCharArray()) { + vowels[c] = true; + } + char[] cs = s.toCharArray(); + int i = 0, j = cs.length - 1; while (i < j) { - if (!vowels.contains(chars[i])) { + while (i < j && !vowels[cs[i]]) { ++i; - continue; } - if (!vowels.contains(chars[j])) { + while (i < j && !vowels[cs[j]]) { + --j; + } + if (i < j) { + char t = cs[i]; + cs[i] = cs[j]; + cs[j] = t; + ++i; --j; - continue; } - char t = chars[i]; - chars[i] = chars[j]; - chars[j] = t; - ++i; - --j; } - return new String(chars); + return String.valueOf(cs); } } ``` +### **C++** + +```cpp +class Solution { +public: + string reverseVowels(string s) { + bool vowels[128]; + memset(vowels, false, sizeof(vowels)); + for (char c : "aeiouAEIOU") { + vowels[c] = true; + } + int i = 0, j = s.size() - 1; + while (i < j) { + while (i < j && !vowels[s[i]]) { + ++i; + } + while (i < j && !vowels[s[j]]) { + --j; + } + if (i < j) { + swap(s[i++], s[j--]); + } + } + return s; + } +}; +``` + ### **Go** ```go func reverseVowels(s string) string { - left, right := 0, len(s)-1 - a := []byte(s) - for left < right { - for left < right && !isVowel(a[left]) { - left++ + vowels := [128]bool{} + for _, c := range "aeiouAEIOU" { + vowels[c] = true + } + cs := []byte(s) + i, j := 0, len(cs)-1 + for i < j { + for i < j && !vowels[cs[i]] { + i++ } - for left < right && !isVowel(a[right]) { - right-- + for i < j && !vowels[cs[j]] { + j-- } - if left != right && isVowel(a[left]) && isVowel(a[right]) { - a[left], a[right] = a[right], a[left] - left++ - right-- + if i < j { + cs[i], cs[j] = cs[j], cs[i] + i, j = i+1, j-1 } } - return string(a) + return string(cs) } +``` -func isVowel(b byte) bool { - return b == 'a' || b == 'e' || b == 'i' || b == 'o' || b == 'u' || - b == 'A' || b == 'E' || b == 'I' || b == 'O' || b == 'U' +### **TypeScript** + +```ts +function reverseVowels(s: string): string { + const vowels = new Set(['a', 'e', 'i', 'o', 'u']); + const cs = s.split(''); + for (let i = 0, j = cs.length - 1; i < j; ++i, --j) { + while (i < j && !vowels.has(cs[i].toLowerCase())) { + ++i; + } + while (i < j && !vowels.has(cs[j].toLowerCase())) { + --j; + } + [cs[i], cs[j]] = [cs[j], cs[i]]; + } + return cs.join(''); } ``` diff --git a/solution/0300-0399/0345.Reverse Vowels of a String/Solution.cpp b/solution/0300-0399/0345.Reverse Vowels of a String/Solution.cpp new file mode 100644 index 0000000000000..aabf7b13ca1f3 --- /dev/null +++ b/solution/0300-0399/0345.Reverse Vowels of a String/Solution.cpp @@ -0,0 +1,23 @@ +class Solution { +public: + string reverseVowels(string s) { + bool vowels[128]; + memset(vowels, false, sizeof(vowels)); + for (char c : "aeiouAEIOU") { + vowels[c] = true; + } + int i = 0, j = s.size() - 1; + while (i < j) { + while (i < j && !vowels[s[i]]) { + ++i; + } + while (i < j && !vowels[s[j]]) { + --j; + } + if (i < j) { + swap(s[i++], s[j--]); + } + } + return s; + } +}; \ No newline at end of file diff --git a/solution/0300-0399/0345.Reverse Vowels of a String/Solution.go b/solution/0300-0399/0345.Reverse Vowels of a String/Solution.go index 4be7848bc927b..4fbd16c8f007e 100644 --- a/solution/0300-0399/0345.Reverse Vowels of a String/Solution.go +++ b/solution/0300-0399/0345.Reverse Vowels of a String/Solution.go @@ -1,23 +1,21 @@ func reverseVowels(s string) string { - left, right := 0, len(s)-1 - a := []byte(s) - for left < right { - for left < right && !isVowel(a[left]) { - left++ + vowels := [128]bool{} + for _, c := range "aeiouAEIOU" { + vowels[c] = true + } + cs := []byte(s) + i, j := 0, len(cs)-1 + for i < j { + for i < j && !vowels[cs[i]] { + i++ } - for left < right && !isVowel(a[right]) { - right-- + for i < j && !vowels[cs[j]] { + j-- } - if left != right && isVowel(a[left]) && isVowel(a[right]) { - a[left], a[right] = a[right], a[left] - left++ - right-- + if i < j { + cs[i], cs[j] = cs[j], cs[i] + i, j = i+1, j-1 } } - return string(a) -} - -func isVowel(b byte) bool { - return b == 'a' || b == 'e' || b == 'i' || b == 'o' || b == 'u' || - b == 'A' || b == 'E' || b == 'I' || b == 'O' || b == 'U' + return string(cs) } \ No newline at end of file diff --git a/solution/0300-0399/0345.Reverse Vowels of a String/Solution.java b/solution/0300-0399/0345.Reverse Vowels of a String/Solution.java index d08183d02bb42..7ff1dc2d70ae1 100644 --- a/solution/0300-0399/0345.Reverse Vowels of a String/Solution.java +++ b/solution/0300-0399/0345.Reverse Vowels of a String/Solution.java @@ -1,24 +1,26 @@ -class Solution { - public String reverseVowels(String s) { - Set vowels - = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U')); - int i = 0, j = s.length() - 1; - char[] chars = s.toCharArray(); - while (i < j) { - if (!vowels.contains(chars[i])) { - ++i; - continue; - } - if (!vowels.contains(chars[j])) { - --j; - continue; - } - char t = chars[i]; - chars[i] = chars[j]; - chars[j] = t; - ++i; - --j; - } - return new String(chars); - } +class Solution { + public String reverseVowels(String s) { + boolean[] vowels = new boolean[128]; + for (char c : "aeiouAEIOU".toCharArray()) { + vowels[c] = true; + } + char[] cs = s.toCharArray(); + int i = 0, j = cs.length - 1; + while (i < j) { + while (i < j && !vowels[cs[i]]) { + ++i; + } + while (i < j && !vowels[cs[j]]) { + --j; + } + if (i < j) { + char t = cs[i]; + cs[i] = cs[j]; + cs[j] = t; + ++i; + --j; + } + } + return String.valueOf(cs); + } } \ No newline at end of file diff --git a/solution/0300-0399/0345.Reverse Vowels of a String/Solution.py b/solution/0300-0399/0345.Reverse Vowels of a String/Solution.py index c947e6be5e007..073b1bc1ca326 100644 --- a/solution/0300-0399/0345.Reverse Vowels of a String/Solution.py +++ b/solution/0300-0399/0345.Reverse Vowels of a String/Solution.py @@ -1,16 +1,14 @@ -class Solution: - def reverseVowels(self, s: str) -> str: - vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'} - i, j = 0, len(s) - 1 - chars = list(s) - while i < j: - if chars[i] not in vowels: - i += 1 - continue - if chars[j] not in vowels: - j -= 1 - continue - chars[i], chars[j] = chars[j], chars[i] - i += 1 - j -= 1 - return ''.join(chars) +class Solution: + def reverseVowels(self, s: str) -> str: + vowels = "aeiouAEIOU" + i, j = 0, len(s) - 1 + cs = list(s) + while i < j: + while i < j and cs[i] not in vowels: + i += 1 + while i < j and cs[j] not in vowels: + j -= 1 + if i < j: + cs[i], cs[j] = cs[j], cs[i] + i, j = i + 1, j - 1 + return "".join(cs) diff --git a/solution/0300-0399/0345.Reverse Vowels of a String/Solution.ts b/solution/0300-0399/0345.Reverse Vowels of a String/Solution.ts new file mode 100644 index 0000000000000..87573734e9a0c --- /dev/null +++ b/solution/0300-0399/0345.Reverse Vowels of a String/Solution.ts @@ -0,0 +1,14 @@ +function reverseVowels(s: string): string { + const vowels = new Set(['a', 'e', 'i', 'o', 'u']); + const cs = s.split(''); + for (let i = 0, j = cs.length - 1; i < j; ++i, --j) { + while (i < j && !vowels.has(cs[i].toLowerCase())) { + ++i; + } + while (i < j && !vowels.has(cs[j].toLowerCase())) { + --j; + } + [cs[i], cs[j]] = [cs[j], cs[i]]; + } + return cs.join(''); +}