Skip to content

Commit 133f887

Browse files
committed
feat: add solutions to lc problem: No.0647
No.0647.Palindromic Substrings
1 parent 593cb90 commit 133f887

File tree

5 files changed

+234
-1
lines changed

5 files changed

+234
-1
lines changed

solution/0600-0699/0647.Palindromic Substrings/README.md

+99-1
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,34 @@
4444

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

47-
在 Manacher 算法的计算过程中,`p[i] - 1` 表示以第 `i` 位为中心的最大回文长度,`(p[i] - 1) / 2` **向上取整**即可得到以第 `i` 位为中心的回文串数量
47+
**方法一:从中心向两侧扩展回文串**
48+
49+
时间复杂度 $O(n^2)$,其中 $n$ 是字符串 `s` 的长度。
50+
51+
**方法二:Manacher 算法**
52+
53+
在 Manacher 算法的计算过程中,$p[i]-1$ 表示以第 $i$ 位为中心的最大回文长度,以第 $i$ 位为中心的回文串数量为 $\left \lceil \frac{p[i]-1}{2} \right \rceil$。
54+
55+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是字符串 `s` 的长度。
4856

4957
<!-- tabs:start -->
5058

5159
### **Python3**
5260

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

63+
```python
64+
class Solution:
65+
def countSubstrings(self, s: str) -> int:
66+
ans, n = 0, len(s)
67+
for k in range(n * 2 - 1):
68+
i, j = k // 2, (k + 1) // 2
69+
while ~i and j < n and s[i] == s[j]:
70+
ans += 1
71+
i, j = i - 1, j + 1
72+
return ans
73+
```
74+
5575
```python
5676
class Solution:
5777
def countSubstrings(self, s: str) -> int:
@@ -75,6 +95,24 @@ class Solution:
7595

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

98+
```java
99+
class Solution {
100+
public int countSubstrings(String s) {
101+
int ans = 0;
102+
int n = s.length();
103+
for (int k = 0; k < n * 2 - 1; ++k) {
104+
int i = k / 2, j = (k + 1) / 2;
105+
while (i >= 0 && j < n && s.charAt(i) == s.charAt(j)) {
106+
++ans;
107+
--i;
108+
++j;
109+
}
110+
}
111+
return ans;
112+
}
113+
}
114+
```
115+
78116
```java
79117
class Solution {
80118
public int countSubstrings(String s) {
@@ -103,6 +141,66 @@ class Solution {
103141
}
104142
```
105143

144+
### **C++**
145+
146+
```cpp
147+
class Solution {
148+
public:
149+
int countSubstrings(string s) {
150+
int ans = 0;
151+
int n = s.size();
152+
for (int k = 0; k < n * 2 - 1; ++k) {
153+
int i = k / 2, j = (k + 1) / 2;
154+
while (~i && j < n && s[i] == s[j]) {
155+
++ans;
156+
--i;
157+
++j;
158+
}
159+
}
160+
return ans;
161+
}
162+
};
163+
```
164+
165+
### **Go**
166+
167+
```go
168+
func countSubstrings(s string) int {
169+
ans, n := 0, len(s)
170+
for k := 0; k < n*2-1; k++ {
171+
i, j := k/2, (k+1)/2
172+
for i >= 0 && j < n && s[i] == s[j] {
173+
ans++
174+
i, j = i-1, j+1
175+
}
176+
}
177+
return ans
178+
}
179+
```
180+
181+
### **JavaScript**
182+
183+
```js
184+
/**
185+
* @param {string} s
186+
* @return {number}
187+
*/
188+
var countSubstrings = function (s) {
189+
let ans = 0;
190+
const n = s.length;
191+
for (let k = 0; k < n * 2 - 1; ++k) {
192+
let i = k >> 1;
193+
let j = (k + 1) >> 1;
194+
while (~i && j < n && s[i] == s[j]) {
195+
++ans;
196+
--i;
197+
++j;
198+
}
199+
}
200+
return ans;
201+
};
202+
```
203+
106204
### **...**
107205

108206
```

solution/0600-0699/0647.Palindromic Substrings/README_EN.md

+90
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@
4141

4242
### **Python3**
4343

44+
```python
45+
class Solution:
46+
def countSubstrings(self, s: str) -> int:
47+
ans, n = 0, len(s)
48+
for k in range(n * 2 - 1):
49+
i, j = k // 2, (k + 1) // 2
50+
while ~i and j < n and s[i] == s[j]:
51+
ans += 1
52+
i, j = i - 1, j + 1
53+
return ans
54+
```
55+
4456
```python
4557
class Solution:
4658
def countSubstrings(self, s: str) -> int:
@@ -62,6 +74,24 @@ class Solution:
6274

6375
### **Java**
6476

77+
```java
78+
class Solution {
79+
public int countSubstrings(String s) {
80+
int ans = 0;
81+
int n = s.length();
82+
for (int k = 0; k < n * 2 - 1; ++k) {
83+
int i = k / 2, j = (k + 1) / 2;
84+
while (i >= 0 && j < n && s.charAt(i) == s.charAt(j)) {
85+
++ans;
86+
--i;
87+
++j;
88+
}
89+
}
90+
return ans;
91+
}
92+
}
93+
```
94+
6595
```java
6696
class Solution {
6797
public int countSubstrings(String s) {
@@ -90,6 +120,66 @@ class Solution {
90120
}
91121
```
92122

123+
### **C++**
124+
125+
```cpp
126+
class Solution {
127+
public:
128+
int countSubstrings(string s) {
129+
int ans = 0;
130+
int n = s.size();
131+
for (int k = 0; k < n * 2 - 1; ++k) {
132+
int i = k / 2, j = (k + 1) / 2;
133+
while (~i && j < n && s[i] == s[j]) {
134+
++ans;
135+
--i;
136+
++j;
137+
}
138+
}
139+
return ans;
140+
}
141+
};
142+
```
143+
144+
### **Go**
145+
146+
```go
147+
func countSubstrings(s string) int {
148+
ans, n := 0, len(s)
149+
for k := 0; k < n*2-1; k++ {
150+
i, j := k/2, (k+1)/2
151+
for i >= 0 && j < n && s[i] == s[j] {
152+
ans++
153+
i, j = i-1, j+1
154+
}
155+
}
156+
return ans
157+
}
158+
```
159+
160+
### **JavaScript**
161+
162+
```js
163+
/**
164+
* @param {string} s
165+
* @return {number}
166+
*/
167+
var countSubstrings = function (s) {
168+
let ans = 0;
169+
const n = s.length;
170+
for (let k = 0; k < n * 2 - 1; ++k) {
171+
let i = k >> 1;
172+
let j = (k + 1) >> 1;
173+
while (~i && j < n && s[i] == s[j]) {
174+
++ans;
175+
--i;
176+
++j;
177+
}
178+
}
179+
return ans;
180+
};
181+
```
182+
93183
### **...**
94184

95185
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
class Solution {
2+
public:
3+
int countSubstrings(string s) {
4+
int ans = 0;
5+
int n = s.size();
6+
for (int k = 0; k < n * 2 - 1; ++k) {
7+
int i = k / 2, j = (k + 1) / 2;
8+
while (~i && j < n && s[i] == s[j]) {
9+
++ans;
10+
--i;
11+
++j;
12+
}
13+
}
14+
return ans;
15+
}
16+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
func countSubstrings(s string) int {
2+
ans, n := 0, len(s)
3+
for k := 0; k < n*2-1; k++ {
4+
i, j := k/2, (k+1)/2
5+
for i >= 0 && j < n && s[i] == s[j] {
6+
ans++
7+
i, j = i-1, j+1
8+
}
9+
}
10+
return ans
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* @param {string} s
3+
* @return {number}
4+
*/
5+
var countSubstrings = function (s) {
6+
let ans = 0;
7+
const n = s.length;
8+
for (let k = 0; k < n * 2 - 1; ++k) {
9+
let i = k >> 1;
10+
let j = (k + 1) >> 1;
11+
while (~i && j < n && s[i] == s[j]) {
12+
++ans;
13+
--i;
14+
++j;
15+
}
16+
}
17+
return ans;
18+
};

0 commit comments

Comments
 (0)