Skip to content

Commit 7041489

Browse files
committed
feat: add solutions to lc problem: No.1177
No.1177.Can Make Palindrome from Substring
1 parent ff6af44 commit 7041489

File tree

6 files changed

+272
-2
lines changed

6 files changed

+272
-2
lines changed

solution/1100-1199/1177.Can Make Palindrome from Substring/README.md

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,22 +45,120 @@ queries[4] : 子串 = "abcda",可以变成回文的 "abcba
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

48+
**方法一:前缀和**
49+
50+
我们可以使用前缀和的思想,预处理出字符串 $s$ 中每个位置的字符出现次数,即 $cnt[i][j]$ 表示字符串 $s$ 中前 $i$ 个字符中第 $j$ 个字母出现的次数。
51+
52+
对于每个查询 $[left, right, k]$,我们可以利用前缀和计算出 $s[left..right]$ 中每个字母出现的次数,统计出现次数为奇数的字母个数 $x$,则需要替换的次数为 $\frac{x}{2}$,如果 $\frac{x}{2} \leq k$,则可以将 $s[left..right]$ 变成回文串。
53+
54+
时间复杂度 $O((n + m) \times C)$,空间复杂度 $O(n \times C)$,其中 $n$ 和 $m$ 分别为字符串 $s$ 和查询数组 $queries$ 的长度,而 $C$ 为字符集大小。本题中 $C = 26$。
55+
4856
<!-- tabs:start -->
4957

5058
### **Python3**
5159

5260
<!-- 这里可写当前语言的特殊实现逻辑 -->
5361

5462
```python
55-
63+
class Solution:
64+
def canMakePaliQueries(self, s: str, queries: List[List[int]]) -> List[bool]:
65+
n = len(s)
66+
cnt = [[0] * 26]
67+
for i, c in enumerate(s, 1):
68+
j = ord(c) - ord('a')
69+
t = cnt[-1][:]
70+
t[j] += 1
71+
cnt.append(t)
72+
ans = []
73+
for left, right, k in queries:
74+
x = sum((b - a) & 1 for a, b in zip(cnt[right + 1], cnt[left]))
75+
ans.append(x // 2 <= k)
76+
return ans
5677
```
5778

5879
### **Java**
5980

6081
<!-- 这里可写当前语言的特殊实现逻辑 -->
6182

6283
```java
84+
class Solution {
85+
public List<Boolean> canMakePaliQueries(String s, int[][] queries) {
86+
int n = s.length();
87+
int[][] cnt = new int[n + 1][26];
88+
for (int i = 1; i <= n; ++i) {
89+
int j = s.charAt(i - 1) - 'a';
90+
for (int k = 0; k < 26; ++k) {
91+
cnt[i][k] = cnt[i - 1][k];
92+
}
93+
cnt[i][j]++;
94+
}
95+
List<Boolean> ans = new ArrayList<>();
96+
for (var q : queries) {
97+
int left = q[0], right = q[1], k = q[2];
98+
int x = 0;
99+
for (int j = 0; j < 26; ++j) {
100+
x += (cnt[right + 1][j] - cnt[left][j]) & 1;
101+
}
102+
ans.add(x / 2 <= k);
103+
}
104+
return ans;
105+
}
106+
}
107+
```
108+
109+
### **C++**
110+
111+
```cpp
112+
class Solution {
113+
public:
114+
vector<bool> canMakePaliQueries(string s, vector<vector<int>>& queries) {
115+
int n = s.size();
116+
int cnt[n + 1][26];
117+
memset(cnt, 0, sizeof cnt);
118+
for (int i = 1; i <= n; ++i) {
119+
int j = s[i - 1] - 'a';
120+
for (int k = 0; k < 26; ++k) {
121+
cnt[i][k] = cnt[i - 1][k];
122+
}
123+
cnt[i][j]++;
124+
}
125+
vector<bool> ans;
126+
for (auto& q : queries) {
127+
int left = q[0], right = q[1], k = q[2];
128+
int x = 0;
129+
for (int j = 0; j < 26; ++j) {
130+
x += (cnt[right + 1][j] - cnt[left][j]) & 1;
131+
}
132+
ans.emplace_back(x / 2 <= k);
133+
}
134+
return ans;
135+
}
136+
};
137+
```
63138
139+
### **Go**
140+
141+
```go
142+
func canMakePaliQueries(s string, queries [][]int) (ans []bool) {
143+
n := len(s)
144+
cnt := make([][26]int, n+1)
145+
for i := 1; i <= n; i++ {
146+
j := s[i-1] - 'a'
147+
for k := 0; k < 26; k++ {
148+
cnt[i][k] = cnt[i-1][k]
149+
}
150+
cnt[i][j]++
151+
}
152+
for _, q := range queries {
153+
left, right, k := q[0], q[1], q[2]
154+
x := 0
155+
for j := 0; j < 26; j++ {
156+
x += (cnt[right+1][j] - cnt[left][j]) & 1
157+
}
158+
ans = append(ans, x/2 <= k)
159+
}
160+
return
161+
}
64162
```
65163

66164
### **...**

solution/1100-1199/1177.Can Make Palindrome from Substring/README_EN.md

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,103 @@ queries[4]: substring = &quot;abcda&quot;, could be changed to &quot;abcba&quot;
5050
### **Python3**
5151

5252
```python
53-
53+
class Solution:
54+
def canMakePaliQueries(self, s: str, queries: List[List[int]]) -> List[bool]:
55+
n = len(s)
56+
cnt = [[0] * 26]
57+
for i, c in enumerate(s, 1):
58+
j = ord(c) - ord('a')
59+
t = cnt[-1][:]
60+
t[j] += 1
61+
cnt.append(t)
62+
ans = []
63+
for left, right, k in queries:
64+
x = sum((b - a) & 1 for a, b in zip(cnt[right + 1], cnt[left]))
65+
ans.append(x // 2 <= k)
66+
return ans
5467
```
5568

5669
### **Java**
5770

5871
```java
72+
class Solution {
73+
public List<Boolean> canMakePaliQueries(String s, int[][] queries) {
74+
int n = s.length();
75+
int[][] cnt = new int[n + 1][26];
76+
for (int i = 1; i <= n; ++i) {
77+
int j = s.charAt(i - 1) - 'a';
78+
for (int k = 0; k < 26; ++k) {
79+
cnt[i][k] = cnt[i - 1][k];
80+
}
81+
cnt[i][j]++;
82+
}
83+
List<Boolean> ans = new ArrayList<>();
84+
for (var q : queries) {
85+
int left = q[0], right = q[1], k = q[2];
86+
int x = 0;
87+
for (int j = 0; j < 26; ++j) {
88+
x += (cnt[right + 1][j] - cnt[left][j]) & 1;
89+
}
90+
ans.add(x / 2 <= k);
91+
}
92+
return ans;
93+
}
94+
}
95+
```
96+
97+
### **C++**
98+
99+
```cpp
100+
class Solution {
101+
public:
102+
vector<bool> canMakePaliQueries(string s, vector<vector<int>>& queries) {
103+
int n = s.size();
104+
int cnt[n + 1][26];
105+
memset(cnt, 0, sizeof cnt);
106+
for (int i = 1; i <= n; ++i) {
107+
int j = s[i - 1] - 'a';
108+
for (int k = 0; k < 26; ++k) {
109+
cnt[i][k] = cnt[i - 1][k];
110+
}
111+
cnt[i][j]++;
112+
}
113+
vector<bool> ans;
114+
for (auto& q : queries) {
115+
int left = q[0], right = q[1], k = q[2];
116+
int x = 0;
117+
for (int j = 0; j < 26; ++j) {
118+
x += (cnt[right + 1][j] - cnt[left][j]) & 1;
119+
}
120+
ans.emplace_back(x / 2 <= k);
121+
}
122+
return ans;
123+
}
124+
};
125+
```
59126
127+
### **Go**
128+
129+
```go
130+
func canMakePaliQueries(s string, queries [][]int) (ans []bool) {
131+
n := len(s)
132+
cnt := make([][26]int, n+1)
133+
for i := 1; i <= n; i++ {
134+
j := s[i-1] - 'a'
135+
for k := 0; k < 26; k++ {
136+
cnt[i][k] = cnt[i-1][k]
137+
}
138+
cnt[i][j]++
139+
}
140+
for _, q := range queries {
141+
left, right, k := q[0], q[1], q[2]
142+
x := 0
143+
for j := 0; j < 26; j++ {
144+
x += (cnt[right+1][j] - cnt[left][j]) & 1
145+
}
146+
ans = append(ans, x/2 <= k)
147+
}
148+
return
149+
}
60150
```
61151

62152
### **...**
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
vector<bool> canMakePaliQueries(string s, vector<vector<int>>& queries) {
4+
int n = s.size();
5+
int cnt[n + 1][26];
6+
memset(cnt, 0, sizeof cnt);
7+
for (int i = 1; i <= n; ++i) {
8+
int j = s[i - 1] - 'a';
9+
for (int k = 0; k < 26; ++k) {
10+
cnt[i][k] = cnt[i - 1][k];
11+
}
12+
cnt[i][j]++;
13+
}
14+
vector<bool> ans;
15+
for (auto& q : queries) {
16+
int left = q[0], right = q[1], k = q[2];
17+
int x = 0;
18+
for (int j = 0; j < 26; ++j) {
19+
x += (cnt[right + 1][j] - cnt[left][j]) & 1;
20+
}
21+
ans.emplace_back(x / 2 <= k);
22+
}
23+
return ans;
24+
}
25+
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
func canMakePaliQueries(s string, queries [][]int) (ans []bool) {
2+
n := len(s)
3+
cnt := make([][26]int, n+1)
4+
for i := 1; i <= n; i++ {
5+
j := s[i-1] - 'a'
6+
for k := 0; k < 26; k++ {
7+
cnt[i][k] = cnt[i-1][k]
8+
}
9+
cnt[i][j]++
10+
}
11+
for _, q := range queries {
12+
left, right, k := q[0], q[1], q[2]
13+
x := 0
14+
for j := 0; j < 26; j++ {
15+
x += (cnt[right+1][j] - cnt[left][j]) & 1
16+
}
17+
ans = append(ans, x/2 <= k)
18+
}
19+
return
20+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public List<Boolean> canMakePaliQueries(String s, int[][] queries) {
3+
int n = s.length();
4+
int[][] cnt = new int[n + 1][26];
5+
for (int i = 1; i <= n; ++i) {
6+
int j = s.charAt(i - 1) - 'a';
7+
for (int k = 0; k < 26; ++k) {
8+
cnt[i][k] = cnt[i - 1][k];
9+
}
10+
cnt[i][j]++;
11+
}
12+
List<Boolean> ans = new ArrayList<>();
13+
for (var q : queries) {
14+
int left = q[0], right = q[1], k = q[2];
15+
int x = 0;
16+
for (int j = 0; j < 26; ++j) {
17+
x += (cnt[right + 1][j] - cnt[left][j]) & 1;
18+
}
19+
ans.add(x / 2 <= k);
20+
}
21+
return ans;
22+
}
23+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def canMakePaliQueries(self, s: str, queries: List[List[int]]) -> List[bool]:
3+
n = len(s)
4+
cnt = [[0] * 26]
5+
for i, c in enumerate(s, 1):
6+
j = ord(c) - ord('a')
7+
t = cnt[-1][:]
8+
t[j] += 1
9+
cnt.append(t)
10+
ans = []
11+
for left, right, k in queries:
12+
x = sum((b - a) & 1 for a, b in zip(cnt[right + 1], cnt[left]))
13+
ans.append(x // 2 <= k)
14+
return ans

0 commit comments

Comments
 (0)