Skip to content

Commit 3b20195

Browse files
committed
string
1 parent 31478a3 commit 3b20195

2 files changed

+143
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*
2+
* 第一种是O(n^3)的解法,没有什么难点
3+
*/
4+
class Solution {
5+
public:
6+
int lengthOfLongestSubstring(string s) {
7+
int max = 0, i, j, k, flag;
8+
for(i = 0; i < s.size(); i++){
9+
for(j = 1; j < s.size() - i; j++){
10+
flag = 0;
11+
for(k = i; k < i + j; k++){
12+
if(s[k] == s[i + j]){
13+
flag = 1;
14+
break;
15+
}
16+
}
17+
if(flag == 1){
18+
break;
19+
}
20+
}
21+
if(j > max){
22+
max = j;
23+
}
24+
}
25+
return max;
26+
}
27+
};
28+
29+
/*
30+
* 2n steps,C++的set用红黑树实现,每一步还需考虑库函数的时间复杂度
31+
*/
32+
class Solution {
33+
public:
34+
int lengthOfLongestSubstring(string s) {
35+
if(s.size() == 0){
36+
return 0;
37+
}
38+
int max = 1, i = 0, j = 1;
39+
set<char> myset;
40+
myset.insert(s[0]);
41+
while(j < s.size() - i){
42+
if(myset.find(s[i + j]) == myset.end()){
43+
myset.insert(s[i + j]);
44+
j++;
45+
if(j > max){
46+
max = j;
47+
}
48+
}
49+
else{
50+
myset.erase(s[i]);
51+
i++;
52+
j--;
53+
}
54+
}
55+
return max;
56+
}
57+
};
58+

5-Longest-Palindromic-Substring.cpp

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
class Solution {
2+
public:
3+
string longestPalindrome(string s) {
4+
int max = 0, i, j, length = s.size();
5+
string maxString = "";
6+
if(length == 0){
7+
return maxString;
8+
}
9+
for(i = 0; i < length; i++){
10+
for(j = 1; i - j >= 0 && i + j < length; j++){
11+
if(s[i - j] != s[i + j]){
12+
break;
13+
}
14+
}
15+
if(max < j * 2 - 1){
16+
max = j * 2 - 1;
17+
maxString = s.substr(i - j + 1, max);
18+
}
19+
}
20+
for(i = 0; i < length - 1; i++){
21+
if(s[i] == s[i + 1]){
22+
for(j = 1; i - j >= 0 && i + 1 + j < length; j++){
23+
if(s[i - j] != s[i + 1 + j]){
24+
break;
25+
}
26+
}
27+
if(max < j * 2){
28+
max = j * 2;
29+
maxString = s.substr(i - j + 1, max);
30+
}
31+
}
32+
}
33+
return maxString;
34+
}
35+
};
36+
37+
/*
38+
* Manacher's Algorithm
39+
*/
40+
class Solution {
41+
public:
42+
string longestPalindrome(string s) {
43+
string str = "#";
44+
int length = s.size(), i, j;
45+
for(i = 0; i < length; i++){
46+
str = str + s[i] + "#";
47+
}
48+
length = str.size();
49+
int *len = new int[length];
50+
int p = 0, max = 0, po = 0;
51+
for(i = 0; i < length; i++){
52+
if(i <= p){
53+
if(len[2 * po - i] <= p - i + 1){
54+
len[i] = len[2 * po - i];
55+
}
56+
else{
57+
len[i] = p - i + 1;
58+
}
59+
}
60+
else{
61+
len[i] = 1;
62+
}
63+
for(j = len[i]; i - j >= 0 && i + j < length; j++){
64+
if(str[i - j] != str[i + j]){
65+
break;
66+
}
67+
}
68+
len[i] = j;
69+
if(p < i + len[i] - 1){
70+
po = i;
71+
p = i + len[i] - 1;
72+
}
73+
if(len[max] < j){
74+
max = i;
75+
}
76+
}
77+
string res = "";
78+
int left = max - len[max] + 1, right = max + len[max] - 1;
79+
for(i = left + 1; i <= right - 1; i += 2){
80+
res += str[i];
81+
}
82+
return res;
83+
}
84+
};
85+

0 commit comments

Comments
 (0)