完整代码在最后,以下为分步讲解

总体思路:可以展开时,分三步判断。

展开的条件:两侧同为数字或小写字母,且右侧严格大于左侧

先来判断是否可以展开

bool judge(int l, int r){
  	//左右下标需要在字符串范围内
    if(l < 0 || r >= s.size()) return false;
    if(s[l] >= '0' && s[l] <= '9' && s[r] >= '0' && s[r] <= '9') return true;
    if(s[l] >= 'a' && s[l] <= 'z' && s[r] >= 'a' && s[r] <= 'z') return true;
    return false;
}
	//主函数中的判断条件
	if(s[i] == '-' && judge(i - 1, i + 1) && s[i - 1] < s[i + 1])

若为直接后继,跳过'-'的输出即可

1.对p1的操作

先用s1把s[i - 1]和是s[i + 1]中间部分保存下来

	string s1 = "";
    for(char c = s[i - 1] + 1; c <= s[i + 1] - 1; c ++)
    	s1 += c;

p1=1时,无论是字母子串还是数字子串,都不需要进行任何操作

p1=2时,若为小写字母则转换为大写字母

p1=3时,把s1中的字符全部替换为*

	if(p1 == 2 && s[i - 1] >= 'a' && s[i - 1] <= 'z')
		for(int i = 0; i < s1.size(); i ++) s1[i] -= 32;
	else if(p1 == 3) for(int i = 0; i < s1.size(); i ++) s1[i] = '*';

2.将s1中的每个字符重复p2次

重新定义一个空字符串s2,处理后得到新的字符串

	string s2 = "";
	for(int i = 0; i < s1.size(); i ++){
		int t = p2;
		while(t --) s2 += s1[i];
	}

3.根据p3决定输出的顺序

	if(p3 == 1) cout << s2;//正序
	else for(int i = s2.size() - 1; i >= 0; i --) cout << s2[i];//倒序

其余情况直接输出s[i]即可

完整代码如下:

#include <bits/stdc++.h>
using namespace std;

int p1, p2, p3;
string s;

bool judge(int l, int r){
    if(l < 0 || r >= s.size()) return false;
    if(s[l] >= '0' && s[l] <= '9' && s[r] >= '0' && s[r] <= '9') return true;
    if(s[l] >= 'a' && s[l] <= 'z' && s[r] >= 'a' && s[r] <= 'z') return true;
    return false;
}

int main(){
    cin >> p1 >> p2 >> p3;
    cin >> s;

    //到-处进行判断 两侧同为数字或小写字母
    for(int i = 0; i < s.size(); i ++)
        if(s[i] == '-' && judge(i - 1, i + 1) && s[i - 1] < s[i + 1]){
            //直接后继 跳过即可
            if(s[i - 1] == s[i + 1] - 1) continue;
            //先把中间部分保存下来
            string s1 = "";
            for(char c = s[i - 1] + 1; c <= s[i + 1] - 1; c ++)
                s1 += c;
            // p1 = 1 不做任何操作
            // p1 = 2 字母子串 转为大写 p1 = 3 变为*
            if(p1 == 2 && s[i - 1] >= 'a' && s[i - 1] <= 'z')
                for(int i = 0; i < s1.size(); i ++) s1[i] -= 32;
            else if(p1 == 3) for(int i = 0; i < s1.size(); i ++) s1[i] = '*';

            // p2 重复次数
            string s2 = "";
            for(int i = 0; i < s1.size(); i ++){
                int t = p2;
                while(t --) s2 += s1[i];
            }

            // p3 输出的顺序
            if(p3 == 1) cout << s2;
            else for(int i = s2.size() - 1; i >= 0; i --) cout << s2[i];
        }
        else cout << s[i];//其余情况直接输出字符即可

}