2012-02-17 3 views
1

Я пытаюсь декодировать входной файл, который выглядит примерно так:инкремента персонажи читают

abbaabbbbaababbaabababaabababaabbababaabababababababa... 

и сравнить его с самодельной отображения я сделал с помощью двух массивов

int secretNumber[10]; 
string coding[10]; 

coding[0]="abb"; 
coding[1]="aabbbba"; 
coding[2]="abab"; 
... 

Я не уверен, как я могу начать с чтения первого символа, который является «а», а затем проверить, находится ли он в массиве кодирования. Если он распечатает секретное кодирование и переместит следующий символ 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 
    } 
    } 
} 

Вопрос: Как я могу идти о чтении в характере, если его матч переход к следующему символу, если не объединить текущий символ и следующий символ, пока есть совпадение.

+1

вы на правильном пути. продолжать. также, если вы хотите получить ответ, задайте вопрос :-) –

+0

Я думаю, вы могли бы попробовать использовать трю здесь. refer en.m.wikipedia.org/wiki/Trie – fizzbuzz

+1

И вопрос в том? – PlasmaHH

ответ

0

Если вы хотите решение, которое работает для произвольных размеров входных, то есть, не хранить все входную память, то вы можете использовать очереди (например, std::deque<char>) для чтения в нескольких символах в то время, отталкивая данные со спины. Затем вы проверяете, осталось ли в очереди три, четыре или пять символов, и если они сравнивают их с вашими шаблонами; если есть совпадение, вы выпадаете соответствующие символы из передней части очереди.

0

Я не уверен, но, возможно, кажется, что вы пытаетесь реализовать LZW compression algorithm. Если это так, то вам придется немного изменить свой подход. Если вы решили, что ваш секретный код является целым числом, вам придется назначить код всем элементам исходного содержимого словаря. Исходный словарь - это в основном все строки в исходном алфавите размером 1. В вашем случае это будет «от 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 предоставит секретный номер.

Вот что это может выглядеть следующим образом:

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 
     */ 
    } 
} 
Смежные вопросы