思路:
这段代码实现了对输入字符的展开操作。具体流程如下:
从输入中读取参数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;
}