2012-02-29 3 views
4

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

Скажем, диапазон определяется как

typedef struct _NSRange { 
    NSUInteger location; // Where the affected substring begins 
    NSUInteger length; // How long the affected substring is 
} NSRange; 

Пример:

string1 = "My cat sometimes likes to eat fish."; 
string 2 = "My cat always likes to drink fresh water, and eat fish."; 

Изменения:

  • {7,9} "иногда" изменено на {7, 6} «всегда»
  • {26,0} добавлено «выпить пресную воду» и «

Мне нужен массив, который содержит подстроки, сгруппированные по изменениям. В данном примере это будет выглядеть следующим образом:

  • "Моя кошка"
  • "всегда"
  • "любит"
  • "пить свежую воду, и"
  • "едят рыбу."

Цель состоит в том, чтобы выделить эти изменения в существующей строке, для которой я должен разбить эту строку на подстроки на основе изменений.

Перед тем как изобретать колесо - есть ли решение в общественном достоянии?

ответ

0

Вы в основном пытаетесь реализовать эквивалент diff. Как поясняется на странице wikipedia, он использует алгоритм longest common subsequence problem.

+1

Хотя это может технически ответить на вопрос, [было бы предпочтительнее] (http://meta.exackexchange.com/q/8259), чтобы вы включили в свой ответ важные части связанной статьи и предоставили ссылка для справки. –

+0

Я ценю ваше замечание. ОП спрашивал, есть ли алгоритм, который делает то, что он пытается достичь. Поэтому я подтвердил это и дал ему имя алгоритма. Это был мой ответ. Связанная статья здесь относится к разграничению, а основные части - это имя алгоритма, а не его детали. – sch

2

Мы разделили задачу на две части.

Часть 1: Поиск различий.

Вы можете сделать это, используя следующий код,

NSString *string1 = @"My cat sometimes likes to eat fish."; 
NSString * string2 = @"My cat always likes to drink fresh water, and eat fish."; 
NSMutableSet *set1 = [NSMutableSet setWithArray:[string1 componentsSeparatedByString:@" "]]; 
NSMutableSet *set2 = [NSMutableSet setWithArray:[string2 componentsSeparatedByString:@" "]]; 
[set2 minusSet:set1]; 
NSLog(@"%@",set2); 

Часть 2: Выделение слова.

Узнав слова, легко выделить.

+0

Интересный подход - но как бы вы справились с этим: «Моя водная кошка любит воду»; «Мой водный кот любит рыбу». - Два входа воды. –

+0

Обновленный пример: «Мой водный кот любит воду с солью»; «Моя водная кошка любит рыбу с водой и сахаром». - блики были бы неправильными, если применять их слева направо на основе матчей («рыба», «и», «сахар».) –

+0

@ МихалоИваноков. Я прав. В этом случае он терпит неудачу. Мы можем быстро взломать его. позвольте мне обновить свой код. – Vignesh

Смежные вопросы