P1114 string字符串截取与字符分类

暂无评定 传统题 GESP字符串STL语法基础 上传者
时间限制1000ms
内存限制256MiB
通过 / 提交0/0

P1114string字符串截取与字符分类

暂无评定 传统题 GESP字符串STL语法基础 上传者
时间限制1000ms
内存限制256MiB
通过 / 提交0/0

题目描述

小D有一个字符串(只包含大小写字母和数字,没有空格)。
现在要进行 n n 次操作,每次操作会给出一个区间 [l,r][l, r](位置从 1 开始计数),要求:

  1. 截取 这个区间内的子串并输出。
  2. 根据子串的内容,判断并输出它的类型。判断规则如下:
子串的特征 输出内容
全部是小写字母(a~z) all lowercase letters
全部是大写字母(A~Z) all uppercase letters
全部是数字(0~9) all digits
只包含字母(大小写字母都有,且没有数字) all letters
同时包含字母(大小写均可)和数字 all

注意:题目保证字符串只包含字母和数字,不会有其他符号。
区间 [l,r][l, r] 保证有效(1≤l≤r≤1 \le l \le r \le 字符串长度),且子串长度至少为 1。

输入格式

第一行:一个字符串 s s ,由大小写字母和数字组成,不含空格。
第二行:一个整数 n n ,表示操作次数。
接下来 n n 行,每行两个整数 l,r l, r ,表示截取的起始和结束位置(包含两端,位置从 1 开始计数)。

输出格式

对于每次操作,输出两行:
第一行:截取得到的子串。
第二行:根据上述规则输出的类型字符串。

输入输出样例

样例输入 #1

aBc123
3
1 3
4 6
2 5

样例输出 #1

aBc
all letters
123
all digits
Bc12
all

样例解释 #1

  • 原始字符串 aBc123,位置 1:a, 2:B, 3:c, 4:1, 5:2, 6:3
  • 操作1 [1,3] → 子串 "aBc",只包含字母(小写和大写都有) → 输出 all letters
  • 操作2 [4,6] → 子串 "123",全数字 → 输出 all digits
  • 操作3 [2,5] → 子串 "Bc12",既有字母(B、c)又有数字(1、2) → 输出 all

样例输入 #2

abcXYZ789
4
1 3
4 6
7 9
1 9

样例输出 #2

abc
all lowercase letters
XYZ
all uppercase letters
789
all digits
abcXYZ789
all

解释:

  • [1,3] → "abc" 全小写
  • [4,6] → "XYZ" 全大写
  • [7,9] → "789" 全数字
  • [1,9] → "abcXYZ789" 包含字母(大小写)和数字 → all

样例输入 #3

AbCdEf
3
1 6
2 5
1 3

样例输出 #3

AbCdEf
all letters
bCdE
all letters
AbC
all letters

说明/提示

如何用 C++ 实现?

  1. 截取子串:使用 substr(pos, len) 方法。
    注意:substr 的第一个参数是起始下标(从 0 开始),第二个参数是长度。
    题目给出的位置 l, r 从 1 开始,所以起始下标为 l-1,长度为 r-l+1。
    示例:

    string sub = s.substr(l-1, r-l+1);
    cout << sub << endl;
    
  2. 判断字符类型:遍历子串的每个字符,用以下函数(需要头文件 <cctype>):

    • islower(c):是否小写字母
    • isupper(c):是否大写字母
    • isdigit(c):是否数字
    • isalpha(c):是否字母(大小写均可)
  3. 分类逻辑:

    • 定义四个计数器或布尔标志:has_lower、has_upper、has_digit。
      遍历每个字符:
      • 如果是小写字母 → has_lower = true
      • 如果是大写字母 → has_upper = true
      • 如果是数字 → has_digit = true
    • 遍历结束后:
      • 如果 has_digit 为假且 has_lower 为真且 has_upper 为假 → 全小写
      • 如果 has_digit 为假且 has_lower 为假且 has_upper 为真 → 全大写
      • 如果 has_digit 为真且 has_lower 为假且 has_upper 为假 → 全数字
      • 如果 has_digit 为假且 has_lower 为真且 has_upper 为真 → 全字母(大小写混合)
      • 如果 has_digit 为真且(has_lower 或 has_upper 为真) → 字母和数字混合
    • 注意:题目保证字符串只有字母和数字,不需要考虑其他字符。

    更简洁的判断顺序(从严格到宽松):

    if (!has_digit && has_lower && !has_upper) 输出 "all lowercase letters";
    else if (!has_digit && !has_lower && has_upper) 输出 "all uppercase letters";
    else if (has_digit && !has_lower && !has_upper) 输出 "all digits";
    else if (!has_digit && has_lower && has_upper) 输出 "all letters";
    else if (has_digit && (has_lower || has_upper)) 输出 "all";
    

    或者更直观:

    • 若全为小写字母 → 情况1
    • 否则若全为大写字母 → 情况2
    • 否则若全为数字 → 情况3
    • 否则若只包含字母(没有数字) → 情况4
    • 否则(既有字母又有数字) → 情况5
  4. 注意:substr 返回的子串是临时对象,可以直接输出或保存。

数据规模

  • 原始字符串长度 1≤∣s∣≤1000 1 \le |s| \le 1000
  • 操作次数 1≤n≤100 1 \le n \le 100
  • 每次操作区间满足 1≤l≤r≤∣s∣ 1 \le l \le r \le |s|
  • 字符串中只包含大小写字母和数字