zoukankan      html  css  js  c++  java
  • 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类的用法,还是收获良多的。

  • 相关阅读:
    Leetcode-Minimum Depth of Binary Tree
    Leetcode-Path Sum II
    Leetcode-Path Sum
    Leetcode-Flatten Binary Tree to Linked List
    Leetcode-Populating Next Right Pointer in Binary Tree II
    Leetcode-Pascal's Triangle II
    Leetcode-Pascal's Triangle
    Leetcode-Triangle
    第10月第20天 afnetwork like MKNetworkEngine http post
    第10月第13天 xcode ipa
  • 原文地址:https://www.cnblogs.com/beyondzones/p/12547457.html
Copyright © 2011-2022 走看看