1. 程式人生 > 實用技巧 >38. Count and Say

38. Count and Say

Count and Say

這一題的難點在於理解題意。

class Solution {
   public:
    string countAndSay(int n) {
        if (n <= 0) {
            return "";
        }
        std::string ret = "1";
        while (--n != 0) {
            std::string current_str;
            for (std::size_t i = 0; i < ret.size(); ++i) {
                std::size_t cnt = 1;
                while (i + 1 < ret.size() && ret[i] == ret[i + 1]) {
                    ++cnt;
                    ++i;
                }
                current_str += (std::to_string(cnt) + ret[i]);
            }
            ret = current_str;
        }
        return ret;
    }
};

輸出:

1: "1"
10: "13211311123113112211"

從輸出結果看,只有 1, 2, 3 三個數字出現。用反證法可以說明這個問題確實只能出現這三個數字。

假設countAndSay(n)中有數字4,那麼第n-1個字串必定有4個相同的數字,假設這個數字為1,則第n-1個字串可以設為"x1111y",第n-1個字串是第n-2個字串的讀法,所以第n-2個字串可以讀為"x個1,1個1,1個y"或者"*個x,1個1,1個1,y個*",這兩種讀法分別可以合成"x+1個1,1個y""*個x,2個1,y個*"。即第n-1個字串可以讀作"(x+1)11y"或者"x21y"。這都不可能是"x1111y"