Строка Находит/Заменяет Алгоритм

Я не полагаю, что существует существующий механизм, который позволяет, Вы для выполнения глубокой копии XNode разрабатываете дерево. Я думаю, что Вас оставляют с двумя опциями.

  1. Делают, поскольку Вы предложили преобразование в строку и затем обратно в дерево
  2. Запись на себе с шаблоном "посетитель"

, шаблон "посетитель", конечно, возможен, но потребуется большая работа тестирование. Я думаю, что Вашим наилучшим вариантом является № 1.

5
задан Community 23 May 2017 в 12:01
поделиться

4 ответа

Описание вашего алгоритма неясно. Нет точного правила, по которому извлеченные токены должны быть вставлены повторно.

Вот пример:

  1. Найдите «три» в «один, два, три, четыре, пять, шесть»
  2. Выберите один из этих двух, чтобы получить 'foo bar 'как результат:

    а. замените «один два» на «foo» и «четыре пять шесть» на «bar»

    b. заменить 'one two four five six' на 'foo bar'

  3. Вставить 'three' обратно на шаге 2, получив строку 'foo bar'

На шаге 3 будет ли 'three' перед 'bar' или после него?

Как только вы придумали четкие правила для повторной вставки, вы можете легко реализовать алгоритм как рекурсивный метод или как итерационный метод со стеком замен.

3
ответ дан 15 December 2019 в 06:29
поделиться

Учитывая структуру проблемы, я бы, вероятно, попробовал алгоритм, основанный на двоичном дереве.

1
ответ дан 15 December 2019 в 06:29
поделиться

Что вы хотите сделать, так это иметь вторую строку, в которой будет храниться вывод . Вы обрабатываете вход и ищите в нем шаблоны . Если соответствующий шаблон не найден, замены не происходит, поэтому вы просто добавляете считанные символы непосредственно в вывод . Если найден шаблон , добавьте строку замены к выходу . Поскольку вы всегда продвигаетесь вперед по строке, нет никаких шансов, что шаблон будет соответствовать предыдущей замене.

Если вы ищете символ за символом (поиск грубой силой), вам придется выяснить, как вы хотите расставить приоритеты по шаблонам; по длине или по порядку они были добавлены в список шаблонов.

В противном случае, вы ' Я буду искать слово за словом или предложение за предложением, что превращается в поиск с использованием буфера. Для этого вам необходимо определить разделители (для слов это будут пробелы, для предложений это будут восклицательные знаки точек и тому подобное, для файла значений, разделенных запятыми, это будут запятые).

-1
ответ дан 15 December 2019 в 06:29
поделиться

псевдокод:

for( String snippet in snippets )
{
    int location = indexOf(snippet,inputData);
    if( location != -1)
    {
        // store replacement text for a found snippet on a stack along with the
        // location where it was found
        lengthChange = getReplacementFor(snippet).length - snippet.length;
        for each replacement in foundStack
        {
            // IF the location part of the pair is greater than the location just found
            //Increment the location part of the pair by the lengthChange to account
            // for the fact that when you replace a string with a new one the location
            // of all subsequent strings will be shifted 
        }

        //remove snippet
        inputData.replace(snippet, "");
    }
}

for( pair in foundStack )
{
    inputData.insert( pair.text, pair.location);
}

По сути, это именно то, что вы сказали в описании проблемы. Пройдите по алгоритму, поместив все в стек с тем местом, где оно было найдено. Вы используете стек, поэтому при повторной вставке во второй половине это происходит в обратном порядке, так что сохраненное «местоположение» применяется к текущему состоянию inputString.

Отредактировано с возможным исправлением для критики комментатора. Учитывает ли комментированный блок в первом блоке вашу критику,

0
ответ дан 15 December 2019 в 06:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: