Skip to content

Commit d44534b

Browse files
committed
feat: update solutions to lcci problem: No.01.02
No.01.02.Check Permutation
1 parent e1ec93c commit d44534b

File tree

7 files changed

+216
-165
lines changed

7 files changed

+216
-165
lines changed

lcci/01.02.Check Permutation/README.md

+98-59
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,25 @@
3030

3131
<!-- 这里可写通用的实现逻辑 -->
3232

33-
**方法一:哈希表**
33+
**方法一:数组或哈希表**
3434

35-
使用哈希表作为字符计数器
35+
先判断两个字符串的长度是否相等,若不相等则直接返回 `false`
3636

37-
时间复杂度 $O(n)$。
37+
然后用一个数组或哈希表统计字符串 $s1$ 中字符出现的次数。
38+
39+
接着遍历另一个字符串 $s2$,每遍历到一个字符,就将该字符对应的次数减一,如果减一后的次数小于 $0$,则说明两个字符串中字符出现的次数不同,直接返回 `false`
40+
41+
最后遍历完字符串 $s2$,返回 `true`
42+
43+
注意:本题测试用例所有字符串仅包含小写字母,因此我们可以直接开一个长度为 $26$ 的数组来计数。
44+
45+
时间复杂度 $O(n)$,空间复杂度 $O(C)$。其中 $n$ 为字符串的长度,而 $C$ 为字符集的大小,本题 $C=26$。
3846

3947
**方法二:排序**
4048

41-
按照字符编码重新排序字符串,再检查两者一致性。
49+
按照字典序对两个字符串进行排序,然后比较两个字符串是否相等。
50+
51+
时间复杂度 $O(n\log n)$,空间复杂度 $O(1)$。
4252

4353
<!-- tabs:start -->
4454

@@ -49,14 +59,13 @@
4959
```python
5060
class Solution:
5161
def CheckPermutation(self, s1: str, s2: str) -> bool:
52-
n1, n2 = len(s1), len(s2)
53-
if n1 != n2:
54-
return False
55-
counter = Counter()
56-
for i in range(n1):
57-
counter[s1[i]] += 1
58-
counter[s2[i]] -= 1
59-
return all(v == 0 for v in counter.values())
62+
return Counter(s1) == Counter(s2)
63+
```
64+
65+
```python
66+
class Solution:
67+
def CheckPermutation(self, s1: str, s2: str) -> bool:
68+
return sorted(s1) == sorted(s2)
6069
```
6170

6271
### **Java**
@@ -66,18 +75,15 @@ class Solution:
6675
```java
6776
class Solution {
6877
public boolean CheckPermutation(String s1, String s2) {
69-
int n1 = s1.length();
70-
int n2 = s2.length();
71-
if (n1 != n2) {
78+
if (s1.length() != s2.length()) {
7279
return false;
7380
}
74-
int[] counter = new int[128];
75-
for (int i = 0; i < n1; ++i) {
76-
++counter[s1.charAt(i)];
77-
--counter[s2.charAt(i)];
81+
int[] cnt = new int[26];
82+
for (char c : s1.toCharArray()) {
83+
++cnt[c - 'a'];
7884
}
79-
for (int v : counter) {
80-
if (v != 0) {
85+
for (char c : s2.toCharArray()) {
86+
if (--cnt[c - 'a'] < 0) {
8187
return false;
8288
}
8389
}
@@ -86,65 +92,98 @@ class Solution {
8692
}
8793
```
8894

89-
### **JavaScript**
95+
```java
96+
class Solution {
97+
public boolean CheckPermutation(String s1, String s2) {
98+
char[] cs1 = s1.toCharArray();
99+
char[] cs2 = s2.toCharArray();
100+
Arrays.sort(cs1);
101+
Arrays.sort(cs2);
102+
return Arrays.equals(cs1, cs2);
103+
}
104+
}
105+
```
90106

91-
```js
92-
var CheckPermutation = function (s1, s2) {
93-
let n1 = s1.length,
94-
n2 = s2.length;
95-
if (n1 != n2) return false;
96-
let counter = {};
97-
for (let i = 0; i < n1; i++) {
98-
let cur1 = s1.charAt(i),
99-
cur2 = s2.charAt(i);
100-
counter[cur1] = (counter[cur1] || 0) + 1;
101-
counter[cur2] = (counter[cur2] || 0) - 1;
107+
### **C++**
108+
109+
```cpp
110+
class Solution {
111+
public:
112+
bool CheckPermutation(string s1, string s2) {
113+
if (s1.size() != s2.size()) return false;
114+
int cnt[26] = {0};
115+
for (char & c : s1) ++cnt[c - 'a'];
116+
for (char & c : s2) if (--cnt[c - 'a'] < 0) return false;
117+
return true;
118+
}
119+
};
120+
```
121+
122+
```cpp
123+
class Solution {
124+
public:
125+
bool CheckPermutation(string s1, string s2) {
126+
sort(s1.begin(), s1.end());
127+
sort(s2.begin(), s2.end());
128+
return s1 == s2;
102129
}
103-
return Object.values(counter).every(v => v == 0);
104130
};
105131
```
106132

107133
### **Go**
108134

109135
```go
110136
func CheckPermutation(s1 string, s2 string) bool {
111-
freq := make(map[rune]int)
112-
for _, r := range s1 {
113-
freq[r]++
137+
if len(s1) != len(s2) {
138+
return false
114139
}
115-
for _, r := range s2 {
116-
if freq[r] == 0 {
117-
return false
118-
}
119-
freq[r]--
140+
cnt := make([]int, 26)
141+
for _, c := range s1 {
142+
cnt[c-'a']++
120143
}
121-
for _, v := range freq {
122-
if v != 0 {
144+
for _, c := range s2 {
145+
cnt[c-'a']--
146+
if cnt[c-'a'] < 0 {
123147
return false
124148
}
125149
}
126150
return true
127151
}
128152
```
129153

130-
### **C++**
154+
```go
155+
func CheckPermutation(s1 string, s2 string) bool {
156+
cs1, cs2 := []byte(s1), []byte(s2)
157+
sort.Slice(cs1, func(i, j int) bool { return cs1[i] < cs1[j] })
158+
sort.Slice(cs2, func(i, j int) bool { return cs2[i] < cs2[j] })
159+
return string(cs1) == string(cs2)
160+
}
161+
```
131162

132-
```cpp
133-
class Solution {
134-
public:
135-
bool CheckPermutation(string s1, string s2) {
136-
int n1 = s1.size();
137-
int n2 = s2.size();
138-
if (n1 != n2) return 0;
139-
vector<int> counter(128);
140-
for (int i = 0; i < n1; ++i) {
141-
++counter[s1[i]];
142-
--counter[s2[i]];
163+
### **JavaScript**
164+
165+
```js
166+
/**
167+
* @param {string} s1
168+
* @param {string} s2
169+
* @return {boolean}
170+
*/
171+
var CheckPermutation = function(s1, s2) {
172+
if (s1.length != s2.length) {
173+
return false;
174+
}
175+
const cnt = new Array(26).fill(0);
176+
for (let i = 0; i < s1.length; ++i) {
177+
const j = s1.codePointAt(i) - 'a'.codePointAt(0);
178+
++cnt[j];
179+
}
180+
for (let i = 0; i < s2.length; ++i) {
181+
const j = s2.codePointAt(i) - 'a'.codePointAt(0);
182+
if (--cnt[j] < 0) {
183+
return false;
143184
}
144-
for (int v : counter)
145-
if (v) return 0;
146-
return 1;
147185
}
186+
return true;
148187
};
149188
```
150189

lcci/01.02.Check Permutation/README_EN.md

+84-55
Original file line numberDiff line numberDiff line change
@@ -41,33 +41,29 @@
4141
```python
4242
class Solution:
4343
def CheckPermutation(self, s1: str, s2: str) -> bool:
44-
n1, n2 = len(s1), len(s2)
45-
if n1 != n2:
46-
return False
47-
counter = Counter()
48-
for i in range(n1):
49-
counter[s1[i]] += 1
50-
counter[s2[i]] -= 1
51-
return all(v == 0 for v in counter.values())
44+
return Counter(s1) == Counter(s2)
45+
```
46+
47+
```python
48+
class Solution:
49+
def CheckPermutation(self, s1: str, s2: str) -> bool:
50+
return sorted(s1) == sorted(s2)
5251
```
5352

5453
### **Java**
5554

5655
```java
5756
class Solution {
5857
public boolean CheckPermutation(String s1, String s2) {
59-
int n1 = s1.length();
60-
int n2 = s2.length();
61-
if (n1 != n2) {
58+
if (s1.length() != s2.length()) {
6259
return false;
6360
}
64-
int[] counter = new int[128];
65-
for (int i = 0; i < n1; ++i) {
66-
++counter[s1.charAt(i)];
67-
--counter[s2.charAt(i)];
61+
int[] cnt = new int[26];
62+
for (char c : s1.toCharArray()) {
63+
++cnt[c - 'a'];
6864
}
69-
for (int v : counter) {
70-
if (v != 0) {
65+
for (char c : s2.toCharArray()) {
66+
if (--cnt[c - 'a'] < 0) {
7167
return false;
7268
}
7369
}
@@ -76,65 +72,98 @@ class Solution {
7672
}
7773
```
7874

79-
### **JavaScript**
75+
```java
76+
class Solution {
77+
public boolean CheckPermutation(String s1, String s2) {
78+
char[] cs1 = s1.toCharArray();
79+
char[] cs2 = s2.toCharArray();
80+
Arrays.sort(cs1);
81+
Arrays.sort(cs2);
82+
return Arrays.equals(cs1, cs2);
83+
}
84+
}
85+
```
8086

81-
```js
82-
var CheckPermutation = function (s1, s2) {
83-
let n1 = s1.length,
84-
n2 = s2.length;
85-
if (n1 != n2) return false;
86-
let counter = {};
87-
for (let i = 0; i < n1; i++) {
88-
let cur1 = s1.charAt(i),
89-
cur2 = s2.charAt(i);
90-
counter[cur1] = (counter[cur1] || 0) + 1;
91-
counter[cur2] = (counter[cur2] || 0) - 1;
87+
### **C++**
88+
89+
```cpp
90+
class Solution {
91+
public:
92+
bool CheckPermutation(string s1, string s2) {
93+
if (s1.size() != s2.size()) return false;
94+
int cnt[26] = {0};
95+
for (char & c : s1) ++cnt[c - 'a'];
96+
for (char & c : s2) if (--cnt[c - 'a'] < 0) return false;
97+
return true;
98+
}
99+
};
100+
```
101+
102+
```cpp
103+
class Solution {
104+
public:
105+
bool CheckPermutation(string s1, string s2) {
106+
sort(s1.begin(), s1.end());
107+
sort(s2.begin(), s2.end());
108+
return s1 == s2;
92109
}
93-
return Object.values(counter).every(v => v == 0);
94110
};
95111
```
96112

97113
### **Go**
98114

99115
```go
100116
func CheckPermutation(s1 string, s2 string) bool {
101-
freq := make(map[rune]int)
102-
for _, r := range s1 {
103-
freq[r]++
117+
if len(s1) != len(s2) {
118+
return false
104119
}
105-
for _, r := range s2 {
106-
if freq[r] == 0 {
107-
return false
108-
}
109-
freq[r]--
120+
cnt := make([]int, 26)
121+
for _, c := range s1 {
122+
cnt[c-'a']++
110123
}
111-
for _, v := range freq {
112-
if v != 0 {
124+
for _, c := range s2 {
125+
cnt[c-'a']--
126+
if cnt[c-'a'] < 0 {
113127
return false
114128
}
115129
}
116130
return true
117131
}
118132
```
119133

120-
### **C++**
134+
```go
135+
func CheckPermutation(s1 string, s2 string) bool {
136+
cs1, cs2 := []byte(s1), []byte(s2)
137+
sort.Slice(cs1, func(i, j int) bool { return cs1[i] < cs1[j] })
138+
sort.Slice(cs2, func(i, j int) bool { return cs2[i] < cs2[j] })
139+
return string(cs1) == string(cs2)
140+
}
141+
```
121142

122-
```cpp
123-
class Solution {
124-
public:
125-
bool CheckPermutation(string s1, string s2) {
126-
int n1 = s1.size();
127-
int n2 = s2.size();
128-
if (n1 != n2) return 0;
129-
vector<int> counter(128);
130-
for (int i = 0; i < n1; ++i) {
131-
++counter[s1[i]];
132-
--counter[s2[i]];
143+
### **JavaScript**
144+
145+
```js
146+
/**
147+
* @param {string} s1
148+
* @param {string} s2
149+
* @return {boolean}
150+
*/
151+
var CheckPermutation = function(s1, s2) {
152+
if (s1.length != s2.length) {
153+
return false;
154+
}
155+
const cnt = new Array(26).fill(0);
156+
for (let i = 0; i < s1.length; ++i) {
157+
const j = s1.codePointAt(i) - 'a'.codePointAt(0);
158+
++cnt[j];
159+
}
160+
for (let i = 0; i < s2.length; ++i) {
161+
const j = s2.codePointAt(i) - 'a'.codePointAt(0);
162+
if (--cnt[j] < 0) {
163+
return false;
133164
}
134-
for (int v : counter)
135-
if (v) return 0;
136-
return 1;
137165
}
166+
return true;
138167
};
139168
```
140169

0 commit comments

Comments
 (0)