题目
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:“aabcccccaaa”
输出:“a2b1c5a3”
示例2:
输入:“abbccd”
输出:“abbccd”
解释:“abbccd"压缩后为"a1b2c2d1”,比原字符串长度更长。
提示:
字符串长度在[0, 50000]范围内。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/compress-string-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答:
string compressString(string S) {
string f;
string::iterator x = S.begin(); string::iterator y = x;
while (y != S.end())
{
while ((y != S.end())&& (*y == *x)) y++;
string num = to_string(y-x);
f.push_back(*x); f += num; x = y;
}
if (f.size() >= S.size()) return S;
else return f;
}
运用迭代器就可以很好的表示。
需要注意的有:
- c++11标准中新加的包含在
<string>
头文件中的to_string()函数非常的香,可以把double、int等转为string。
2.要写成(y != S.end())&& (*y == *x))而不是 ( (*y == *x)&&(y != S.end())),运用其断路特性,避免访问 *S.end()。
c++11字符串和数字转换的函数:
to_string(val) 返回数值val的string表达。val可以为任何算数类型。
stoi(s,p,b) stol(s,p,b) stoul(s,p,b) stoll(s,p,b) stoull(s,p,b) stof(s,p,b) stod(s,p,b) stold(s,p,b) 返回s的起始子串表示数内容的数值。以上几个函数分别对应int、long、unsigned long、long long、unsigned long long、float、double、long double。b表示转换所用的基数,默认是10。p是size_t指针,用来保存s中第一个非数值字符的下标,p的默认值是0,即函数不保存下标。
string s2 = "pi = 3.14";
string s = "23.2";
double d = stod(s2.substr(s2.find_first_of("+-.0123456789")));
double sda = stod(s);