LeetCode 38. Count and Say(计数和描述)

题目描述:

    The count-and-say sequence is the sequence of integers with the first five terms as following:

1.     1
2.     11
3.     21
4.     1211
5.     111221
     1  is read off as  "one 1"  or  11 .
    11 is read off as "two 1s" or 21.

    21 is read off as "one 2, then one 1" or 1211.
    Given an integer n, generate the nth term of the count-and-say sequence.
    Note: Each term of the sequence of integers will be represented as a string.

例子:

Input: 1
Output: "1"
Input: 4
Output: "1211"

分析:
    题意:给定一个数字字符串,初始值为"1"。这样定义一次操作:统计字符串中所有的连续重复子串的长度cnt和对应的字符c,并把"cnt"、"c"加入新的数字字符串中。返回第n次操作的结果。
    思路:这是一道数学模拟题,我们采用双指针法。假设字符串的长度为len,需要得到第n次操作之后的结果。初始化指针start = 0,end = 0,分别表示一个重复子串的开始和结束位置。我们找到一个连续重复子串后,得到长度为end - start + 1,对应字符为c,则把"end - start + 1"、"c"加入新串中,并更新start = end + 1、end = start,重复上述步骤。经过完整n轮迭代之后,返回结果。

代码:

#include <bits/stdc++.h>

using namespace std;

class Solution {
public:
    string countAndSay(int n) {
        string ans = "1";
        if(n <= 1){
            return ans;
        }
        for(int i = 1; i < n; i++){
            string tmp = "";
            int len = ans.length();
            int start = 0, end = 0;
            while((start <= end) && (end < len)){
                while((end + 1 < len) && ans[end + 1] == ans[start]){
                    end++;
                }
                tmp += (to_string(end - start + 1) + ans[start]);
                start = end + 1;
                end = start;
            }
            ans = tmp;
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值