鱼C论坛

 找回密码
 立即注册
查看: 2328|回复: 1

子串

[复制链接]
发表于 2021-5-7 20:44:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大贤者福尔的字符串研究取得了积极的进展,但他现在遇到了一个新的问题,他需要找到一个字符串的所有满足特殊条件的子串。他的问题具体来说是,对一个给定的字符串,按给定的子串大小N进行分割(N不超过字符串的长度),分割点位于依次位于字符串中相邻字符之间,使得最大子串的长度不超过N。同时,把分割后的所有子串依次拼接,就可以恢复为原始字符串。如给定字符串ABCDE,若N为1,则分割的子串为A B C D E;若N为2,根据起始分割点不同,可以有两种分割结果,分别为A BC DE和AB CD E。
福尔希望你能够帮他,找出他需要的所有子串。
输入
输入数据有若干行,第一行为一个长度不超过N(1≤N≤100)的字符串,字符串由大写英文字母组成。 随后的行中,每行为一个正整数x(1≤x≤N),数量不超过N个。
输出
对每组输入数据,先在单独的行中输出测试样例的编号Case x:,x为样例编号,从1开始。随后的行中,按顺序依次输出所有分割得到的子串。一种分割方式的结果输出到同一行中,存在多种不同的分割方式时,按起始分割点的从小到大的顺序在不同的行中输出分割结果。
示例输入
ABCDE
1
2
3
示例输出
Case 1:
A B C D E
Case 2:
A BC DE
AB CD E
Case 3:
A BCD E
AB CDE
ABC DE
各位大佬看看吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-5-7 22:20:13 | 显示全部楼层
本帖最后由 yuxijian2020 于 2021-5-8 09:41 编辑
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <cstdio>
  6. #include <cstdlib>
  7. #include <cstring>

  8. using namespace std;

  9. constexpr size_t MAX_LEN = 50;

  10. struct Part
  11. {
  12.     size_t start;
  13.     size_t len;

  14.     Part() : start(0), len(0) {}
  15.     Part(size_t s, size_t l) : start(s), len(l) {}
  16. };

  17. class StringSplitPlan
  18. {
  19. public:
  20.     StringSplitPlan()                   = delete;

  21.     explicit StringSplitPlan(StringSplitPlan& other) :
  22.                     str(other.str), len(other.len), splits(other.splits) {}
  23.    
  24.     explicit StringSplitPlan(StringSplitPlan&& other)
  25.     {
  26.         str = move(other.str);
  27.         len = other.len;
  28.         splits.swap(other.splits);
  29.     }

  30.     explicit StringSplitPlan(const string& str) : str(str), len(1) { this->Split(); }
  31.     explicit StringSplitPlan(const string &str, size_t len) : str(str), len(len) { this->Split(); }

  32.     const string& GetString() const { return str; }
  33.     size_t GetLen() const { return len; }
  34.     const vector<vector<Part>>& GetArray() const { return splits; }

  35.     void PrintAll() const
  36.     {
  37.         printf_s("Case %lld:\n", len);

  38.         for(const auto& vec : splits)
  39.         {
  40.             for(const auto& part : vec)
  41.                 printf_s("%s ", string(str, part.start, part.len).c_str());

  42.             printf_s("\n");
  43.         }
  44.     }

  45. private:
  46.     void Split()
  47.     {
  48.         for (size_t pos = 1; pos <= len; ++pos)
  49.         {
  50.             vector<Part> temp;
  51.             size_t start = 0, end = pos;
  52.             temp.emplace_back(Part(start, end - start));

  53.             do
  54.             {
  55.                 start = end;
  56.                 end += len;
  57.                 temp.emplace_back(Part(start, end - start));

  58.             } while (end <= str.size());

  59.             splits.emplace_back(temp);
  60.         }
  61.     }

  62.     //待分割字符串
  63.     string str;
  64.     //每块长度
  65.     size_t len;
  66.     //分割后的下标数组
  67.     vector<vector<Part>> splits;
  68. };

  69. char* GetInputString()
  70. {
  71.     char* temp = new char[MAX_LEN];
  72.     memset(temp, 0, MAX_LEN);
  73.     char c     = 0;
  74.     int    i     = 0;

  75.     while((c = getchar()) != '\n')
  76.         temp[i++] = c;

  77.     if(temp[i - 1] == '\r')
  78.         temp[i - 1] = '\0';

  79.     return temp;
  80. }

  81. int main()
  82. {
  83.     string str;
  84.     size_t len;
  85.     vector<StringSplitPlan> result;
  86.     char* c;

  87.     printf_s("请输入一个字符串:");
  88.     cin >> str;
  89.     getchar();

  90.     while(1)
  91.     {
  92.         printf_s("请输入分割后的子串的最大长度(直接回车则结束输入):");
  93.         c = GetInputString();

  94.         if(strlen(c) == 0)
  95.             break;

  96.         len = static_cast<size_t>(atoll(c));
  97.         delete[] c;

  98.         if(len > str.size())
  99.         {
  100.             printf_s("子串长度不能大于原字符串!\n");
  101.             continue;
  102.         }

  103.         result.emplace_back(StringSplitPlan(str, len));
  104.     }

  105.     for(const auto& i : result)
  106.         i.PrintAll();

  107.     return 0;
  108. }
复制代码


11111.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-29 10:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表