科大讯飞笔试题---字符串切割

1、

题目描述
小红拿到了一个字符串,她希望你帮她切割成若干子串,满足以下两个条件:
子串长度均为不小于 3 的奇数。
子串内部的字符全部相同。
输入
第一行输入一个正整数n,代表字符串长度。第二行输入一个字符串,仅由小写字母组成。
输出
如果无解,请输出-1。否则按顺序输出若干个字符串,用空格隔开。
样例输入
11
aaabbbbbbbb
样例输出
aaa bbb bbbbb
提示
在样例中,长度为 8 的 bbb…b 子串在样例输出中被分为了 bbb 和 bbbbb,在只要满足题目给定的条件下,将其分为 bbbbb 和 bbb 也对。
也就是输出还可以为:
aaa bbbbb bbb
数据范围:
1 < n ≤ 200000

2、解答

#include <iostream>
#include <vector>
#include <sstream> // 用于字符串流
int main()
{
    std::vector<std::string> S;
    int n, count = 1, num = 0;
    std::string line;
    std::cin >> n;
    std::cin.ignore();

    std::getline(std::cin, line);

    int length = n;

    for (int i = 0; i < length; i++)
    {
        while (line[i] > 'z' || line[i] < 'a')
        {
            std::cout << -1 << std::endl;
            return 0;
        }

        if (line[i] == line[i + 1])
        {
            count ++;
            continue;
        }
        
        if (count % 2)//奇数
        {
            num = num + count;
            
            std::string s1 = line.substr(num-count, count);
            S.push_back(s1);
        }
        else
        {
            num = num + count;
            if (count < 6)
            {
                std::cout << -1 << std::endl;
                return 0;
            }
            else
            {
                int min = 3;
                std::string s2 = line.substr(num - count, min);
                std::string s3 = line.substr(min, count-min);
                S.push_back(s2);
                S.push_back(s3);
            }
        }
        count = 1;
    }
    for (const std::string& str : S) {
        std::cout << str <<" ";
    }
    
    return 0;
}

3、关键

主要是最后一起输出,不能找到一组就输出,后面可能不满足的条件。
面对未知的字符串个数时,立马应该想到用vector之类可以自动延伸的容器存储。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值