44
44
45
45
<!-- 这里可写通用的实现逻辑 -->
46
46
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 ` 的长度。
48
56
49
57
<!-- tabs:start -->
50
58
51
59
### ** Python3**
52
60
53
61
<!-- 这里可写当前语言的特殊实现逻辑 -->
54
62
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
+
55
75
``` python
56
76
class Solution :
57
77
def countSubstrings (self , s : str ) -> int :
@@ -75,6 +95,24 @@ class Solution:
75
95
76
96
<!-- 这里可写当前语言的特殊实现逻辑 -->
77
97
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
+
78
116
``` java
79
117
class Solution {
80
118
public int countSubstrings (String s ) {
@@ -103,6 +141,66 @@ class Solution {
103
141
}
104
142
```
105
143
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
+
106
204
### ** ...**
107
205
108
206
```
0 commit comments