我正在编写一个简单的程序,使用RLE算法压缩字符串,我成功编写了编码函数,并认为我也找到了解码函数,但它没有给出正确的输出。
string RunLengthDecoding(string input)
{
string decodedOutput = "";
int secondIterator = 0;
for(int firstIterator=0; firstIterator<input.length(); firstIterator++)
{
string counter = ""; int letterCoefficient = 0;
if(!isalpha(input[firstIterator]))
continue;
else
{
counter = input.substr(secondIterator, firstIterator);
secondIterator = firstIterator;
istringstream(counter) >> letterCoefficient;
for(int i=0; i<letterCoefficient; i++)
decodedOutput += input[firstIterator];
}
}
return decodedOutput;
}
如果我输入“6A”或任何一个单个字符的数字,它可以正常工作。 示例:
6A - &gt; AAAAAA,77B - &gt; BBBBB ..... BBBBB 77次。
但是如果我输入“6A3B”就会吐出“AAAAAA”。或者实际上任何一个数字都贴在A旁边,而且任何数字都贴在B旁边,它仍然只是打印第一个字符的前缀次数,完全忽略了它之后的所有内容。
答案 0 :(得分:1)
应该是更像这样的东西:
string RunLengthDecoding(string input)
{
string decodedOutput = "";
int secondIterator = 0;
for (int firstIterator = 0; firstIterator<input.length(); firstIterator++)
{
string counter = ""; int letterCoefficient = 0;
if (!isalpha(input[firstIterator]))
continue;
else
{
counter = input.substr(secondIterator, firstIterator - secondIterator); // Little change here
secondIterator = firstIterator + 1; // Add one here
istringstream(counter) >> letterCoefficient;
for (int i = 0; i<letterCoefficient; i++)
decodedOutput += input[firstIterator];
}
}
return decodedOutput;
}
注意,这似乎适用于基本输入,例如&#34; 6A3B25C&#34;但我觉得某些边缘情况会破坏这一点,因为没有安全检查。