Хотя несколько особых случаев (например, суффиксов) может быть обработано с более простыми алгоритмами, ро обрабатывать общий случай, вы можете:
1/сначала выведите общую последовательность. Если ваша строка не очень длинная, вам будет предложен самый длинный общий алгоритм подпоследовательности (LCS, см. https://en.wikipedia.org/wiki/Longest_common_subsequence_problem).
Вы можете найти Obj-C и быстрой реализации ЛВП здесь: http://jakubturek.pl/blog/2015/06/27/using-swifts-string-type-with-care/
2/с ЛВП, легко получить и переформатирование, смотри, например, https://en.wikipedia.org/wiki/Diff_utility, например. Ниже в реализации Obj-C (категории NSString, предполагая, что мы имеем longestCommonSubsequence: из приведенной выше ссылке):
- (NSArray *) lcsDiff:(NSString *)string
{
NSString *lcs = [self longestCommonSubsequence:string];
NSUInteger l1 = [self length];
NSUInteger l2 = [string length];
NSUInteger lc = [lcs length];
NSUInteger idx1 = 0;
NSUInteger idx2 = 0;
NSUInteger idxc = 0;
NSMutableString *s1 = [[NSMutableString alloc]initWithCapacity:l1];
NSMutableString *s2 = [[NSMutableString alloc]initWithCapacity:l2];
NSMutableArray *res = [NSMutableArray arrayWithCapacity:10];
for (;;) {
if (idxc >= lc) break;
unichar c1 = [self characterAtIndex:idx1];
unichar c2 = [string characterAtIndex:idx2];
unichar cc = [lcs characterAtIndex:idxc];
if ((c1==cc) && (c2 == cc)) {
if ([s1 length] || [s2 length]) {
NSArray *e = @[ s1, s2];
[res addObject:e];
s1 = [[NSMutableString alloc]initWithCapacity:l1];
s2 = [[NSMutableString alloc]initWithCapacity:l1];
}
idx1++; idx2++; idxc++;
continue;
}
if (c1 != cc) {
[s1 appendString:[NSString stringWithCharacters:&c1 length:1]];
idx1++;
}
if (c2 != cc) {
[s2 appendString:[NSString stringWithCharacters:&c2 length:1]];
idx2++;
}
}
if (idx1<l1) {
[s1 appendString:[self substringFromIndex:idx1]];
}
if (idx2<l2) {
[s2 appendString:[string substringFromIndex:idx2]];
}
if ([s1 length] || [s2 length]) {
NSArray *e = @[ s1, s2];
[res addObject:e];
}
return res;
}
код возвращает массив с одним элементом (string1, string2) для каждой разности между двумя строками , например [@ "abcXefY" lcsDiff: @ "aZbcKef"] вернется @[ @[ @"", @"Z"], @[ @"X", @"K"], @[ @"Y", @""]];
Я начал набирать ответ на ваш вопрос, а затем понял, чтобы дать лучший ответ, нужно было бы узнать немного более подробно. Например, если строка первая - «мясо», а другая - «пряный фрикадель», вы хотите, чтобы разница была «пряным мячиком» или буквами, отличными между предложениями, например. {С, р, я, с, у, б, л}? –
Как вы определяете разницу между строками? Всегда ли это так, как вы здесь выразились, где одна строка имеет дополнительные символы в конце? Или, например, как вы считаете разницу между _pippo_ и _pissone_? – FluffulousChimp
Возможный дубликат [Проверить, являются ли два NSStrings похожими] (http://stackoverflow.com/questions/12984442/check-if-two-nsstrings-are-similar) –