38. Count and Say
阿新 • • 發佈:2020-12-15
這一題的難點在於理解題意。
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"