Skip to content

Commit 40dd0da

Browse files
add problem 5 and test function
1 parent 16acc4b commit 40dd0da

File tree

1 file changed

+129
-0
lines changed

1 file changed

+129
-0
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/*
2+
* Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
3+
* Example:
4+
* Input: "babad"
5+
* Output: "bab"
6+
* Note: "aba" is also a valid answer.
7+
* Created by supercoderhawk on 2017/7/23.
8+
*/
9+
10+
#include
11+
#include
12+
#include
13+
14+
char *longestPalindrome(char *s) {
15+
if (s == NULL)
16+
return s;
17+
int maxLength = 0, maxStart = 0, maxEnd = 0, length = 0, isReverse = 0;
18+
int start = -1, end = -1,reverseStart = 0,reverseEnd = 0;
19+
char *pStr = s;
20+
while (*pStr != '\0') {
21+
length++;
22+
pStr++;
23+
}
24+
25+
char *reverseStr = (char *) malloc(sizeof(char) * (length + 1));
26+
for (int i = 0; i < length; i++) {
27+
reverseStr[i] = s[length - 1 - i];
28+
}
29+
reverseStr[length] = '\0';
30+
for (int i = 1; i <= length; i++) {
31+
start = end = reverseStart = reverseEnd = -1;
32+
for (int j = 0; j < i; j++) {
33+
if (start == -1 && s[j] == reverseStr[length - i + j]) {
34+
start = j;
35+
reverseStart = i - j;
36+
} else if (start != -1 && s[j] != reverseStr[length - i + j]) {
37+
end = j;
38+
reverseEnd = i - j;
39+
if( start == reverseEnd && end == reverseStart)
40+
{
41+
if (end - start > maxLength) {
42+
maxLength = end - start;
43+
maxEnd = end;
44+
maxStart = start;
45+
}
46+
}
47+
start = end = -1;
48+
}
49+
}
50+
if (start != -1 && end == -1)
51+
{
52+
end = i;
53+
reverseEnd = 0;
54+
if( start == reverseEnd && end == reverseStart)
55+
{
56+
if (end - start > maxLength) {
57+
maxLength = end - start;
58+
maxEnd = end;
59+
maxStart = start;
60+
}
61+
}
62+
}
63+
64+
}
65+
for (int i = 1; i <= length; i++) {
66+
start = end = -1;
67+
for (int j = 0; j < i; j++) {
68+
if (start == -1 && s[length - i + j] == reverseStr[j]) {
69+
start = j;
70+
reverseStart = i - j;
71+
} else if (start != -1 && s[length - i + j] != reverseStr[j]) {
72+
end = j;
73+
reverseEnd = i - j;
74+
if( start == reverseEnd && end == reverseStart)
75+
{
76+
if (end - start > maxLength) {
77+
maxLength = end - start;
78+
maxEnd = end;
79+
maxStart = start;
80+
isReverse = 1;
81+
}
82+
}
83+
start = end = -1;
84+
}
85+
}
86+
if (start != -1 && end == -1)
87+
{
88+
end = i;
89+
reverseEnd = 0;
90+
if( start == reverseEnd && end == reverseStart)
91+
{
92+
if (end - start > maxLength) {
93+
maxLength = end - start;
94+
maxEnd = end;
95+
maxStart = start;
96+
isReverse = 1;
97+
}
98+
}
99+
}
100+
101+
102+
}
103+
104+
if (maxEnd - maxStart == 0)
105+
return '\0';
106+
char *palindrome = (char *) malloc(sizeof(char) * (maxEnd - maxStart + 1));
107+
if (isReverse)
108+
strncpy(palindrome, reverseStr + maxStart, maxEnd - maxStart);
109+
else
110+
strncpy(palindrome, s + maxStart, maxEnd - maxStart);
111+
palindrome[maxEnd - maxStart] = '\0';
112+
return palindrome;
113+
}
114+
115+
void testLongestPalindrome() {
116+
char *s1 = "b";
117+
printf("%s\n", longestPalindrome(s1));
118+
char *s2 = "babad";
119+
printf("%s\n", longestPalindrome(s2));
120+
char *s3 = "abb";
121+
printf("%s\n", longestPalindrome(s3));
122+
char *s4 = "abcdasdfghjkldcba";
123+
printf("%s\n", longestPalindrome(s4));
124+
char *s5 = "cbbd";
125+
printf("%s\n", longestPalindrome(s5));
126+
char *s6 = "babaddtattarrattatddetartrateedredividerb";
127+
printf("%s\n", longestPalindrome(s6));
128+
}
129+

0 commit comments

Comments
 (0)