Skip to content

Commit 2a4d5d3

Browse files
committed
add a simple palindrome solution
1 parent e99b538 commit 2a4d5d3

File tree

4 files changed

+90
-1
lines changed

4 files changed

+90
-1
lines changed

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,8 @@ PROGRAMS = m_based_demo \
6767
sort_demo \
6868
bubble_sort_demo \
6969
selection_sort_demo \
70-
8queue_demo
70+
8queue_demo \
71+
palindrome_demo
7172

7273
all: $(PROGRAMS)
7374

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
Knuth–Morris–Pratt algorithm
9090
Disjoint-Set
9191
8-Queue Problem
92+
Palindrome
9293

9394
####贡献者 ( Contributors ) :
9495
Samana : for heavy work of MSVC compatability

include/palindrome.h

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
/*******************************************************************************
2+
* DANIEL'S ALGORITHM IMPLEMENTAIONS
3+
*
4+
* /\ | _ _ ._ o _|_ |_ ._ _ _
5+
* /--\ | (_| (_) | | |_ | | | | | _>
6+
* _|
7+
*
8+
* PALINDROMES
9+
*
10+
* WORDS LIKE:
11+
* RACECAR DEED LEVEL PIP
12+
* ROTOR CIVIC POP MADAM
13+
* EYE NUN RADAR TOOT
14+
*
15+
* This program will find the longest part of mirror.
16+
*
17+
* http://en.wikipedia.org/wiki/Palindrome
18+
******************************************************************************/
19+
20+
#ifndef _PALINDROME_H_
21+
#define _PALINDROME_H_
22+
23+
#include <stdio.h>
24+
#include <stdlib.h>
25+
#include <string.h>
26+
27+
namespace alg {
28+
static void palindrome(const char * S) {
29+
char *R= strdup(S);
30+
int len = strlen(S);
31+
// reverse
32+
for(int i=0;i<len;i++) {
33+
R[len-i-1] = S[i];
34+
}
35+
36+
int middle = 0;
37+
int maxlen = 0;
38+
for(int i=0;i<len;i++) {
39+
// compare S[0:i] with R[0:length-i-1] in reverse order
40+
int offset = 0;
41+
int curlen = 0;
42+
43+
// try odd
44+
while (i-offset>= 0 && len-i-1-offset >= 0) {
45+
if (S[i-offset] == R[len-i-1-offset]) {
46+
curlen++;
47+
} else {
48+
break;
49+
}
50+
offset++;
51+
}
52+
53+
if (curlen > maxlen) {
54+
maxlen = curlen;
55+
middle = i;
56+
}
57+
58+
// try even
59+
while (i-offset>= 0 && len-i-2-offset >= 0) {
60+
if (S[i-offset] == R[len-i-2-offset]) {
61+
curlen++;
62+
} else {
63+
break;
64+
}
65+
offset++;
66+
}
67+
68+
if (curlen > maxlen) {
69+
maxlen = curlen;
70+
middle = i;
71+
}
72+
}
73+
74+
printf("str:%s len:%d middle:%d\n",S, maxlen, middle);
75+
free(R);
76+
}
77+
}
78+
79+
#endif //

src/palindrome_demo.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#include "palindrome.h"
2+
#include <stdio.h>
3+
4+
int main() {
5+
alg::palindrome("banana");
6+
alg::palindrome("abba");
7+
alg::palindrome("aaaaa");
8+
}

0 commit comments

Comments
 (0)