【题目】
给你一个字符串 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;
}
};