二刷LeetCode--38. 外观数列(C++版本)思维题

本题一个思路是使用递归,从n开始向前进行递归,每一次计算n-1的表达形式,一直递归下去就可以得到第n个的表达式。也可以从前面开始向后计算,从第二个开始,因为第一个就是自己,对于每一个数,计算当前对应的序列,那么就再需要一个循环计算当前序列对应的下一个序列的形式了,而且也需要一个变量记录当前序列中重复的元素,因此我们定义一个计数器,注意,计数器的移动以及当前循环变量的移动是相关的,循环变量不能简单的向后移动,而是需要移动到下一个不重复的元素的位置,因此计数器开始的定义也与循环变量相关

class Solution {
public:
    string countAndSay(int n) {
        // 先将第一个字符定下来,然后对应的结果也定下来
        string s = "1", res = "1";
        // 计算每一个数字对应的外观数列
        for(int i =  2; i <= n;++i)
        {
            // 此时说明n大于2,因此将结果置空,重新计算
            res = "";
            // 这里计算当前序列的重复问题,j就是作为游标,其下一个位置与cnt相关
            // 因此这里不能简单的用++j决定j的走向
            for(int j = 0;j < s.size();)
            {
                // 而cnt也与j的位置相关,j每次需要移动到下一个不同元素的位置
                int cnt = j;
                // 找相邻并且相同的字符,从自身开始
                while(cnt < s.size() && s[cnt] == s[j])
                    ++cnt;
                // 几个几
                res += to_string(cnt - j) + s[j];
                // j跳到应该去的地方也就是下一个不同元素的位置
                j = cnt;
            }
            // 更新s
            s = res;
        }
        return res;
    }
};

你可能感兴趣的:(LeetCode,c++,leetcode,算法)