完整代码在最后,以下为分步讲解
总体思路:可以展开时,分三步判断。
展开的条件:两侧同为数字或小写字母,且右侧严格大于左侧
先来判断是否可以展开
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];//其余情况直接输出字符即可
}