第四天 基本字符串压缩

题目描述

利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能。比如,字符串“aabcccccaaa”经压缩会变成“a2b1c5a3”。若压缩后的字符串没有变短,则返回原先的字符串。

给定一个string iniString为待压缩的串(长度小于等于3000),保证串内字符均由大小写英文字母组成,返回一个string,为所求的压缩后或未变化的串。

测试样例
"aabcccccaaa"
返回:"a2b1c5a3"
"welcometonowcoderrrrr"
返回:"welcometonowcoderrrrr"

首先,感谢大神指点,指出了我代码中数量大于个位数时候,索引出现的问题。

先说我初始解法主要问题:1. 修改string中的值(replace,insert,erase); 2. 修改之后对于index的调整;3. 结尾时的特殊情况考虑。

附代码:

#include <iostream>
#include <string>
#include <sstream>
#include <stdio.h>
using namespace std;

int main()
{
	string s("aabcccccccaaa");
	int num = 0;	
	char a = ' ';
	int len = s.length();
	for (int i = 0, times = 0;;)
	{
		stringstream n;
		times++;
		if (times == len)
		{
			if (a == s[i])
			{
				num++;
				n << num;
				s.replace(i - num + 2, num - 1, n.str());
			}
			else
			{
				n << num;
				s.replace(i - num + 1, num - 1, n.str());
				s += "1";
			}
			break;
		}
		else
		{
			if (a == s[i])
			{
				num++;
				i++;
			}
			else
			{
				if (num != 0)
				{
					n << num;
					s.replace(i - num + 1, num - 1, n.str());
					i -= num - 2;
				}
				num = 1;
				a = s[i];
				i++;
			}
		}
	}

	cout << s << endl;
	system("pause");
	return 0;
}

然后说大神的思路,不要在原string里做修改,直接新建一个string,醍醐灌顶。
class Zipper {
public:
	string zipString(string iniString) {
		// write code here
		string snew("");
		char a = ' ';
		int num = 0;// 初始化有点问题
		for (int i = 0; i < iniString.length(); i++)
		{
			stringstream n;
			if (i == iniString.length() - 1)
			{
				if (iniString[i] == a)// 说明不是第一个
				{
					num++;
					n << num;
					snew += n.str();
				}
				else// 说明最后一个是新的元素
				{
					n << num;
					snew += n.str() + iniString[i] + "1";
				}
			}
			else
			{
				if (iniString[i] == a)
					num++;
				else
				{
					n << num;
					if (num != 0)
						snew += n.str() + iniString[i];
					else
						snew += iniString[i];
					num = 1;
					a = iniString[i];
				}
			}
		}
		if (snew.length() < iniString.length())
			return snew;
		else
			return iniString;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值