我正在尝试解码看起来像这样的输入文件:
abbaabbbbaababbaabababaabababaabbababaabababababababa...
并将其与我使用两个数组进行的临时映射进行比较
int secretNumber[10];
string coding[10];
coding[0]="abb";
coding[1]="aabbbba";
coding[2]="abab";
...
我不知道如何通过读取第一个'a'字符开始,然后检查它是否在编码数组中。如果打印出secretCoding并移动下一个字符b。否则,如果它不在数组中,则将下一个字符添加到字符串中的第一个字符,并检查数组中是否有“ab”,如果不是,则添加下一个产生“abb”的字符,依此类推。
这样的事情:
while (!(readFile.eof()) ){
for(int i=0; i<10; i++){
if(stringOfChars==coding[i]){
cout << secretNumber[i] <<endl;
//Now increment to next char
}
else{
//combine the current string with the next character
}
}
}
问题:如果匹配移动到下一个字符,如果没有将当前字符和下一个字符组合直到匹配,我该如何读取字符。
答案 0 :(得分:1)
您应该使用名为interpreter的设计模式。
答案 1 :(得分:0)
如果你想要一个适用于任意输入大小的解决方案,即不将整个输入存储在内存中,那么你可以使用一个队列(例如std::deque<char>
)来读取一些字符。时间,从后面推送数据。然后检查队列是否还剩下三个,四个或五个字符,如果是,则将它们与您的模式进行比较;如果匹配,则从队列前面弹出相应的字符。
答案 2 :(得分:0)
我不确定,但也许您似乎正在尝试实施LZW compression algorithm。如果是这种情况,那么你必须稍微改变一下你的方法。如果您已确定您的密码是整数,那么您必须为字典的初始内容的所有元素分配代码。初始字典基本上是大小为1的源字母表中的所有字符串。在您的情况下,如果您保持简单,它将是“a到z”,或者只是“a”和“b”
另一件事是你需要查看字典中任何已分配代码的现有字符串。最好的方法是使用STL map
container,可以在您的情况下将strings
映射到integers
。此外,随着新字符串继续添加到字典中,最好对字典的大小进行限制。
总的来说,
std::map< std::string, int > dictionary;
作为strings
的词典,例如a
,b
,aa
,ab
,aab
,等等......以及它的匹配代码。coding[0], coding[1]
不是必需的,因为strings
将作为此词典中的key
。secretNumber[0], secretNumber[1]
也不需要value
,因为key
会给出secretNumber。以下是它的样子:
std::map< std::string, int > dictionary;
int iWordCount = 0;
/*
Initialize the dictionary with the code for strings of length 1 in your source alphabet.
*/
dictionary["a"] = 0;
dictionary["b"] = 1;
iWordCount = 2; // We would be incrementing this as we keep on adding more strings to the dictionary.
std::string newWord = "", existingWord = "";
while (!(readFile.eof()) ){
/*
I'm assuming the next character is read in the variable "ch".
*/
newWord += ch;
if ( dictionary.count(newWord) != 0 ) { // Existing word.
/*
Do something
*/
}
else { // We encountered this word for the first time.
/*
Do something else
*/
}
}