字符串迴文判斷(palindrome)

描述:

前後對稱的字符串可稱爲迴文,比如 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

發佈了35 篇原創文章 · 獲贊 10 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章