描述:
前後對稱的字符串可稱爲迴文,比如 abcdedcba
用例:
"abc" //false
"abba" //true
"a" //單個字符串 true
"" //空字符串 true
CODE:
long myStrlen(char* head)
{
char* tail = head;
while (*tail)
tail++;
return tail - head;
}
// 迴文英文單詞:palindrome 這裏不改了。。
bool isHuiWen(char* head)
{
long len = myStrlen(head);
char* tail = head;
tail = head + len - 1;
while ((tail - head) > 0) {
if (*head != *tail)
return false;
tail--;
head++;
}
return true;
}
//下面是兩種,遞歸現實現迴文判斷,推薦第二種
bool isHuiWen2(char* head, char* tail)
{
if (*head != *tail)
return false;
if (tail - head < 2) {
return true;
} else if (tail - head > 1) {
return isHuiWen2(++head, --tail);
}
return false;
}
bool isHuiWen3(char* head, long n)
{
if (n <= 1)
return true;
if (head[0] != head[n - 1]) {
return false;
}
if (n < 2) {
return true;
} else if (n > 1) {
return isHuiWen3(head + 1, n - 2);
}
return false;
}
int main()
{
char str[] = "bbabb";
char* ch = str;
char* tail;
if (myStrlen(ch) < 1)
tail = &ch[0];
else
tail = ch + myStrlen(ch) - 1;
printf("%d\n", isHuiWen(ch));
printf("%d\n", isHuiWen2(ch, tail));
printf("%d\n", isHuiWen3(ch, myStrlen(ch)));
}
一些總結:
- 指針或數組通過下標[]操作,*tail = ch[0],直接返回的是這個指針的值,加&纔是對應地址
指針移動可通過 tail++; tail = ch + n; tail = &ch[1]; 三種方式都可以
字符串指針操作 程序不會檢查是否越界,這個需要自己控制好
能用遞歸實現的問題特點:
1.通常處理一個集合,
2.不論這個集合的大小,都需要執行相同的操作,和判斷
3.集合能逐步化簡
代碼在XCode下編寫,自帶的re-indecent不好用,推薦一個在XCode8.0上能用的排版插件XcodeClangFormat:https://github.com/mapbox/XcodeClangFormat