string类运用:特殊的翻译
特殊的翻译
小明的工作是对一串英语字符进行特殊的翻译:当出现连续且相同的小写字母时,须替换成该字母的大写形式,在大写字母的后面紧跟该小写字母此次连续出现的个数;与此同时,把连续的小写字母串的左侧和右侧的字符串交换位置;重复该操作,直至没有出现连续相同的小写字母为止。现在小明想请你帮他完成这种特殊的翻译。
输入格式
输入一串由小写字母构成的字符串。(字符串长度不大于250)
输出格式
输出翻译后的字符串
输入样例
lodnkmgggggggoplerre
输出样例
eG7lodnkmR2ople
Part1 题目分析
该题是一道字符串运用相关的问题,主要的难点在于如何实现题述的每个操作。
我们可以先来概括一下实现的步骤:
1.在读入的字符串中查找相同且连续的小写字母,并记录个数
2.将连续的小写字母替换成单个对应的大写字母
3.将统计的个数转化成字符型
4.求出相同字符前后子串并交换
5.重复以上步骤直到字符串不再发生变化为止。
由于这里如果运用字符数组来模拟会比较繁琐,所以我采用了C++的sting类型,通过运用其中的成员函数来降低模拟难度。
Part2 代码
(1)重复个数整型转化为字符型
(2)字符串处理
(3)完整代码
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
void sovle(unsigned char *a,int sum){
int m,n,t;
m=sum/100;
n=sum/10%10;
t=sum%10;
if(m!=0){
a[0]=m+48;
a[1]=n+48;
a[2]=t+48;
}
else{
if(n!=0){
a[0]=n+48;
a[1]=t+48;
}
else a[0]=t+48;
}
}
string ans(string s1){
string s2,s3;
unsigned char count[4];int sum;
memset(count,0,sizeof(count));
sum=1;
for(int i=0;i<s1.length()-1;i++){
while(s1[i]==s1[i+1]&&s1[i]>='a'&&s1[i]<='z'){
sum++;
i++;
}
if(sum>1){
s1[i-sum+1]-=32;
s2=s1.substr(0,i-sum+1);
s3=s1.substr(i+1);
s1.replace(i+1,s1.length()-i-1,s2);
sovle(count,sum);
s1.replace(i-sum+2,sum-1,(char *)count);
s1.replace(0,i-sum+1,s3);
}
if(sum>1) return s1;
}
return s1;
}
int main(){
string s1,s2,temp;
cin>>s1;
s2=ans(s1);
while(s1.compare(s2)!=0){
s1=ans(s2);
temp=s1;
s1=s2;
s2=temp;
}
cout<<s1;
}
Part3 总结
这题在解题过程中还是遇到不少问题,比如在没有限定条件之前,连续的数字也会被错判成连续的字母并处理;还有就是由于处理并调换子串的时候,字符的位置和长度会发生改变,所以字符替换的次序上一不小心就会出错。通过这道题,我学习巩固了C++ string类的相关知识,了解到了更多有关string类的用法,还是收获良多的。