From c0805f68c1e50f649b45711607f958dac18e10ee Mon Sep 17 00:00:00 2001 From: ccshell Date: Tue, 17 Feb 2015 09:51:11 +0800 Subject: [PATCH] Update 01.04.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改代码使更符合c语言c99标准,修改IsPalindrome2中的错误。 --- ebook/zh/01.04.md | 63 +++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 29 deletions(-) diff --git a/ebook/zh/01.04.md b/ebook/zh/01.04.md index 6b48e5424..cb8db7b4d 100644 --- a/ebook/zh/01.04.md +++ b/ebook/zh/01.04.md @@ -18,25 +18,28 @@ 代码如下:: ```cpp +#include + bool IsPalindrome(const char *s, int n) { - //非法输入 - if (s == NULL || n < 1) - return false; - char *front, *back; - - //初始化头指针和尾指针 - front = s; - back = s + n - 1; - - while (front < back) - { - if (*front != *back) - return false; // 不是回文,立即返回 - ++front; - --back; - } - return true; // 是回文 + //非法输入 + if (s == NULL || n < 1) + return false; + + const char *front, *back; + + //初始化头指针和尾指针 + front = s; + back = s + n - 1; + + while (front < back) + { + if (*front != *back) + return false; // 不是回文,立即返回 + ++front; + --back; + } + return true; // 是回文 } ``` @@ -48,20 +51,22 @@ bool IsPalindrome(const char *s, int n) 上述解法一从两头向中间扫描,那么是否还有其它办法呢?我们可以先从中间开始、然后向两边扩展查看字符是否相等。参考代码如下: ```cpp +#include bool IsPalindrome2(const char *s, int n) { - if (s == NULL || n < 1) - return false; // 非法输入 - char *first, *second; - - int m = ((n >> 1) - 1) >= 0 ? (n >> 1) - 1 : 0; // m is themiddle point of s - first = s + m; - second = s + n - 1 - m; - - while (first >= s) - if (s[first--] != s[second++]) - return false; // not equal, so it's not apalindrome - return true; // check over, it's a palindrome + if (s == NULL || n < 1) + return false; // 非法输入 + + const char *first, *second; + + int m = ((n >> 1) - 1) >= 0 ? (n >> 1) - 1 : 0; // m 是中间点 + first = s + m; + second = s + n - 1 - m; + + while (first >= s) + if (*(first--) != *(second++)) + return false; // 不是回文,立即返回 + return true; // 是回文 } ``` 时间复杂度:O(n),空间复杂度:O(1)。