思路:

这段代码实现了对输入字符的展开操作。具体流程如下:

从输入中读取参数p1,p2和p3。

从输入中读取待展开的字符串。

创建一个空字符串result用于保存展开后的结果。

遍历输入字符串中的每个字符:

如果当前字符是减号并且两侧的字符符合展开条件,即两侧字符都是小写字母或数字,并且右侧字符比左侧字符大:

根据展开方式p1和字符类型来填充字符:

如果p1是1或2,即填充字母,则使用tolower或toupper函数将前一个字符转换为小写或大写,然后将填充字符添加到结果字符串中。

如果p1是3,即填充星号,则将(nextChar - prevChar - 1) * p2个星号添加到结果字符串中。 跳过当前的减号。

如果当前字符不是减号或不满足展开条件,则直接将当前字符添加到结果字符串中。

如果p3是2,即结果需要翻转,则使用reverse函数将结果字符串翻转。

输出最终结果字符串。

这样,根据给定的参数和输入字符串,程序就能够进行相应的展开操作并输出最终结果。

代码

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string solution(string s,int p1,int p2,int p3){
	string res="";
	string temp="";
	int n=s.size();
	for(int i=0;i<n;i++){
		if(s[i]=='-'&&i>0&&i<n-1&&((islower(s[i-1])&& islower(s[i+1])
		&&s[i-1]<s[i+1])||(isdigit(s[i-1])&&isdigit(s[i+1])&&s[i-1]<s[i+1]))){
			if(p1==1||p1==2){
				char fill=(p1==1)?tolower(s[i-1]):toupper(s[i-1]);
				for(char j=s[i-1]+1;j<s[i+1];j++){
					fill=(p1==1)?tolower(j):toupper(j);
					for(int k=0;k<p2;k++){
						temp+=fill;
					}			
				}
			}
			if(p1==3){
				for(int j=0;j<(s[i+1]-s[i-1]-1)*p2;j++)
				res+="*";
			}
			if(p3==2) {reverse(temp.begin(),temp.end());}
			res+=temp;
			temp="";
		}
		else 
		res+=s[i];
	}
	
	return res;
	
}
int main()
{
	int p1,p2,p3;
	cin>>p1>>p2>>p3;
	string s;
	cin>>s;
	string res=solution(s,p1,p2,p3);
	cout<<res<<endl;
	
  return 0;
}