【简单】1370. 上升下降字符串

643 篇文章 5 订阅

【题目】
给你一个字符串 s ,请你根据下面的算法重新构造字符串:
1、从 s 中选出 最小 的字符,将它 接在 结果字符串的后面
2、从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。
3、
来源:leetcode
链接:https://leetcode-cn.com/problems/increasing-decreasing-string/
【示例1】
输入:s = “aaaabbbbcccc”
输出:“abccbaabccba”
解释:第一轮的步骤 1,2,3 后,结果字符串为 result = “abc”
第一轮的步骤 4,5,6 后,结果字符串为 result = “abccba”
第一轮结束,现在 s = “aabbcc” ,我们再次回到步骤 1
第二轮的步骤 1,2,3 后,结果字符串为 result = “abccbaabc”
第二轮的步骤 4,5,6 后,结果字符串为 result = “abccbaabccba”
【示例2】
输入:s = “rat”
输出:“art”
解释:单词 “rat” 在上述算法重排序以后变成 “art”
【示例3】
输入:s = “leetcode”
输出:“cdelotee”
【示例4】
输入:s = “ggggggg”
输出:“ggggggg”
【示例5】
输入:s = “spo”
输出:“ops”
【提示】
1 <= s.length <= 500
s 只包含小写英文字母。
【思路】
1、先对字符串进行排序,排成从小到大的顺序
2、设置一个visit数组,来判断该字符串的每一位被访问(这里的访问并不是字面意上的访问,而是)情况,如果visit[i]=0则表明该位没有被访问,否则该位被访问。
3、设置计数器cnt=0,用来记录被访问的字符的个数,设置maxlen为字符串的长度
4、函数主体由一个while循环组成,当cnt!=maxlen的时候一直执行循环体,直到cnt==maxlen为止退出循环
5、循环体由两个部分组成,两个for循环,一个从左到右,一个从右到左,正好满足题目要求。
【代码】

class Solution {
public:
    int visit[500]={0};
    string str[26]={"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o"
    ,"p","q","r","s","t","u","v","w","x","y","z"};
    string sortString(string s) {
        char pre=' ';
        string rs="";
        int cnt=0,maxlen=s.size();
        sort(s.begin(),s.end());
        while(cnt!=maxlen){
            pre=' ';
            for(int i=0;i<maxlen;i++)//从左到右
                if(visit[i]==0&&s[i]!=pre){
                    pre=s[i];
                    visit[i]=1;
                    rs+=str[s[i]-'a'];
                    cnt++;
                }
            if(cnt==maxlen)            
                break;
            pre=' ';
            for(int i=maxlen-1;i>=0;i--)//从右到左
                if(visit[i]==0&&s[i]!=pre){
                    pre=s[i];
                    visit[i]=1;
                    rs+=str[s[i]-'a'];
                    cnt++;
                }
        }
        return rs;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值