将一段压缩后的字符串解压缩,并且排序输出
解压规则:
每个字符串后面跟随一个数字,表示这个字符串的重复次数。例如,“a5″解压后的结果为”aaa;”abc3″解压后的结果
为abcabcabc。
排序规则
1、根据每个字符串的重复次数升序排序,然后输入结果例如,“a3b2”,输出的结果为“ obama
2、如果字符重复次数一样,则根据ASC!码顺序做升序排序,然后输出结果。
例如,“b2a2,输出的结果为”abb
输入描述:输入的原始字符串仅包含字母与数字
思路讲解:使用hash对字符串个数进行存储,Key为字符个数,Value为字符串数组,打印字符时按key依次打印,对value中的字符串数组排序输出即可。
按顺序对输入字符串进行读取,将字符数据存在一个字符串中,当遇到数字时:
while (str[i] >= ‘0’&&str[i] <= ‘9’&&i < len) {
num = num * 10 + str[i] – ‘0’;
i++;
}
使用num进行存储,当出现非数字字符时,将key等于Num,value为字符串数组,如果key存在,读取value字符串数组,将字符串存入数组,更新key,value;如果不存在就新建数组存入hash表中。
typedef struct typen {
vector<string> k;
}typen;
int main()
{
string str;
string st;
cin >> str;
int len = str.size();
int i = 0;
int num = 0;
int flag = 0;
map<int, typen > m;
while(i<len)
{
if (str[i] >= '0'&&str[i] <= '9')
{
num = num * 10 + str[i] - '0';
i++;
while (str[i] >= '0'&&str[i] <= '9'&&i < len) {
num = num * 10 + str[i] - '0';
i++;
}
typen sss;
if (m.find(num) == m.end()) m[num] = sss;
else sss = m[num];
string mm="";
for (int j = 0; j < num; j++)
mm += st;
sss.k.push_back(mm);
m[num] = sss;
st = "";
num = 0;
}
else
{
st.push_back(str[i++]);
}
}
map<int, typen>::iterator iter;
for (int i=0;i<1024;i++)
{
typen sk = m[i];
sort(sk.k.begin(), sk.k.end());
for (int i = sk.k.size()-1; i >-1; i--)
cout << sk.k[i];
}
return 0;
}
推荐一种字符压缩题:String Compression 字符串压缩