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类的用法,还是收获良多的。

原文地址:https://www.cnblogs.com/beyondzones/p/12547457.html