题目描述
小D有一个字符串(只包含大小写字母和数字,没有空格)。
现在要进行 次操作,每次操作会给出一个区间 (位置从 1 开始计数),要求:
- 截取 这个区间内的子串并输出。
- 根据子串的内容,判断并输出它的类型。判断规则如下:
| 子串的特征 | 输出内容 |
|---|---|
全部是小写字母(a~z) |
all lowercase letters |
全部是大写字母(A~Z) |
all uppercase letters |
全部是数字(0~9) |
all digits |
| 只包含字母(大小写字母都有,且没有数字) | all letters |
| 同时包含字母(大小写均可)和数字 | all |
注意:题目保证字符串只包含字母和数字,不会有其他符号。
区间 保证有效( 字符串长度),且子串长度至少为 1。
输入格式
第一行:一个字符串 ,由大小写字母和数字组成,不含空格。
第二行:一个整数 ,表示操作次数。
接下来 行,每行两个整数 ,表示截取的起始和结束位置(包含两端,位置从 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++ 实现?
-
截取子串:使用
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; -
判断字符类型:遍历子串的每个字符,用以下函数(需要头文件
<cctype>):islower(c):是否小写字母isupper(c):是否大写字母isdigit(c):是否数字isalpha(c):是否字母(大小写均可)
-
分类逻辑:
- 定义四个计数器或布尔标志:
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
- 定义四个计数器或布尔标志:
-
注意:
substr返回的子串是临时对象,可以直接输出或保存。
数据规模
- 原始字符串长度
- 操作次数
- 每次操作区间满足
- 字符串中只包含大小写字母和数字