Skip to content

Commit 0e78e52

Browse files
committed
647
1 parent a67a91c commit 0e78e52

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ Leetcode刷题记录
5151
+ No.211 [cpp](cpp/211.cpp)
5252
+ No.212 [cpp](cpp/212.cpp)
5353

54+
### 字符串
55+
56+
+ No.647 [cpp](cpp/647.cpp) **回文串算法**
57+
5458
###
5559

5660
+ No.32 [cpp](cpp/32.cpp) [python](python/32.py)

cpp/647.cpp

+111
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
#include <bits/stdc++.h>
2+
3+
using namespace std;
4+
5+
#define PRINT_VECTOR(vec, type) \
6+
do { \
7+
copy(vec.begin(), vec.end(), ostream_iterator<type>(cout, " ")); \
8+
cout << endl; \
9+
} while(0)
10+
11+
#define CHECK(j, k, m) ((j) >= 0) && ((k) < (m))
12+
13+
14+
class Solution {
15+
public:
16+
/**
17+
*
18+
*/
19+
int countSubstrings(string s)
20+
{
21+
ostringstream strbuf;
22+
strbuf << "#";
23+
for (const char &c: s) {
24+
strbuf << c << "#";
25+
}
26+
string str = strbuf.str();
27+
// #a#b#c#
28+
int m = str.size();
29+
vector<int> radius(m, 0);
30+
31+
int r_radius = 0, mid_index = 0, count = 0;
32+
for (int i = 0; i < m; ++i) {
33+
34+
if (i <= r_radius + mid_index) {
35+
// 对称位置是否超出右边的限制
36+
// printf("%d, %d\n", radius[mid_index*2-i], mid_index+r_radius-i);
37+
radius[i] = min(radius[mid_index*2-i], mid_index+r_radius-i);
38+
}
39+
#if 0
40+
printf("radius[%d]=%d ", i, radius[i]);
41+
printf(" str[i]=%c ", str[i]);
42+
printf("str[i-radius[i]-1]=%c, str[i+radius[i]+1]=%c ", str[i-radius[i]-1], str[i+radius[i]+1] );
43+
printf("%d ===> %d,%d\n", CHECK(i-radius[i]-1, i+radius[i]+1, m), i, str[i-radius[i]-1] == str[i + radius[i]+1]);
44+
#endif
45+
while (CHECK(i-radius[i]-1, i+radius[i]+1, m) && str[i-radius[i]-1] == str[i+radius[i]+1]) {
46+
++radius[i];
47+
}
48+
49+
if (mid_index + r_radius < i + radius[i]) {
50+
r_radius = radius[i];
51+
mid_index = i;
52+
}
53+
count += (radius[i]+1)/2;
54+
}
55+
// PRINT_VECTOR(radius, int);
56+
return count;
57+
}
58+
};
59+
60+
#if 0
61+
62+
#define CHECK(j, k, m) ((j) >= 0) && ((k) < (m))
63+
64+
/** 基础算法*/
65+
int countSubstrings(string s) {
66+
ostringstream str;
67+
int n = s.size(), count = 0;
68+
for (int i = 0; i < n; ++i) {
69+
70+
str << "#" << s[i];
71+
}
72+
str << '#';
73+
string ss = str.str();
74+
75+
int j, k, m = ss.size(), flag_num;
76+
for (int i = 1; i < m; ++i) {
77+
j = i - 1, k = i + 1;
78+
flag_num = ss[i] == '#'? 1:0;
79+
while(CHECK(j, k, m)) {
80+
if (ss[j]=='#') flag_num++;
81+
if (ss[j] == ss[k]){
82+
if (ss[j]=='#') {
83+
if (flag_num < 2) count++;
84+
} else {
85+
count++;
86+
}
87+
}
88+
else break;
89+
j--;
90+
k++;
91+
}
92+
}
93+
return count;
94+
}
95+
#endif
96+
97+
98+
int main(int argc, char const *argv[])
99+
{
100+
Solution s;
101+
freopen("test.in", "r", stdin);
102+
string str;
103+
while (cin >> str) {
104+
/* code */
105+
cout << str << endl;
106+
int result = s.countSubstrings(str);
107+
cout << result << endl;
108+
}
109+
110+
return 0;
111+
}

0 commit comments

Comments
 (0)