From 63af6331124132437fbbbff9d61e04c85768b695 Mon Sep 17 00:00:00 2001 From: begeekmyfriend Date: Thu, 2 Nov 2017 09:40:22 +0800 Subject: [PATCH] Valid palindrome Signed-off-by: begeekmyfriend --- 125_valid_palindrome/Makefile | 2 + 125_valid_palindrome/valid_palindrome.c | 51 +++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 125_valid_palindrome/Makefile create mode 100644 125_valid_palindrome/valid_palindrome.c diff --git a/125_valid_palindrome/Makefile b/125_valid_palindrome/Makefile new file mode 100644 index 0000000..fc2acce --- /dev/null +++ b/125_valid_palindrome/Makefile @@ -0,0 +1,2 @@ +all: + gcc -O2 -o test valid_palindrome.c diff --git a/125_valid_palindrome/valid_palindrome.c b/125_valid_palindrome/valid_palindrome.c new file mode 100644 index 0000000..154e849 --- /dev/null +++ b/125_valid_palindrome/valid_palindrome.c @@ -0,0 +1,51 @@ +#include +#include +#include +#include + +static bool valid(char c) +{ + return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); +} + +bool isPalindrome(char* s) +{ + int len = strlen(s); + int low = 0; + int high = len - 1; + + while (low < high) { + if (!valid(s[low])) { + low++; + } else if (!valid(s[high])) { + high--; + } else if (s[low] == s[high]) { + low++; + high--; + } else { + if (isalpha(s[low]) && isalpha(s[high])) { + int diff = s[low] > s[high] ? s[low] - s[high] : s[high] - s[low]; + if (diff == 'a' - 'A') { + low++; + high--; + } else { + return false; + } + } else { + return false; + } + } + } + + return low >= high; +} + +int main(int argc, char **argv) +{ + if (argc != 2) { + fprintf(stderr, "Usage: ./test string\n"); + exit(-1); + } + printf("%s\n", isPalindrome(argv[1]) ? "true" : "false"); + return 0; +}