CC05:基本字符串压缩

题目

利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。
给定一个string iniString为待压缩的串(长度小于等于10000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。
测试样例

"aabcccccaaa"
返回:"a2b1c5a3"
"welcometonowcoderrrrr"
返回:"welcometonowcoderrrrr"

解答

这道题一定注意要看清题意,结合测试样例来分析。自己刚开始以为是将"aaabbcca"转变为"a4b2c2"这种形式,后来看了测试用例发现思路错了,如果是我这样的解法题目可以为"字符计数",错误代码如下:

#include<iostream>
#include<string>
#include<algorithm>
#include<map>
using namespace std;

string zipString(string iniString) {
	// write code here
	int cnt = 0;
	int len = iniString.length();
	string temp;
	sort(iniString.begin(), iniString.end());
	map<char, int> res;
	for (int i = 0; i < iniString.length(); i++)
	{
		res[iniString[i]]++;
	}
	temp.push_back(iniString[0]);
	temp += to_string(res[iniString[0]]);
	for (int i = 0; i < len-1; i++)
	{
		if (iniString[i + 1] != iniString[i])
		{
			temp.push_back(iniString[i+1]);
			temp += to_string(res[iniString[i+1]]);
		}
		
	}
	return temp.length() < iniString.length() ? temp : iniString;
}

int main()
{
	string s = "welcometonowcoderrrrr";
	s = zipString(s);
	for (int i = 0; i < s.length(); i++)
	{
		cout << s[i];
	}
	cout << endl;
	system("pause");
	return 0;
}

实际上仔细分析,只要有重复的就执行压缩,如果前面没有重复的,就不执行压缩操作,代码如下"

class Zipper {
public:
string zipString(string iniString) {
	// write code here
	string temp;
	int count = 1;
	char ch = iniString[0];
	for (int i = 1; i < iniString.length(); i++)
	{
		if (iniString[i] == ch)
			count++;
		else
		{
			temp.push_back(ch);
			temp += to_string(count);
			count = 1;
			ch = iniString[i];
		}
	}
	temp.push_back(ch);
	temp += to_string(count);
	return temp.length() < iniString.length() ? temp : iniString;
  }
};
posted @ 2018-06-29 10:32  MrYun  阅读(121)  评论(0编辑  收藏  举报