Вот решение, использующее только пространство имен System.
Важная часть здесь - сначала поменять символы в обоих массивах на токены.
Это означает, что для "ala bala portocala" мы будет иметь:
{ 0, 1, 0, 2, 3, 0, 1, 0, 2, 4, 5, 6, 7, 5, 8, 0, 1, 0 }
Так что, когда будет найден новый символ (который раньше не появлялся), мы увеличиваем число на 1.
И вы можете видеть, что это хорошо работает для оценки если два массива символов совпадают с точки зрения этой интересной перспективы.
static int[] Tokenize(char[] array)
{
int length = array.Length;
int[] distinctArray = new int[length];
int offset = 0;
for (int i = 0; i < length; i++)
{
bool appearedBefore = false;
for (int j = 0; j < i; j++)
{
if (array[j] == array[i])
{
appearedBefore = true;
distinctArray[i] = distinctArray[j];
break;
}
}
if (!appearedBefore)
{
distinctArray[i] = offset;
offset++;
}
}
return distinctArray;
}
Тогда метод теста:
static void Test(char[] array1, char[] array2)
{
Console.WriteLine("[{0}] VS [{1}]", new string(array1), new string(array2));
int[] array1Tokenized = Tokenize(array1);
int[] array2Tokenized = Tokenize(array2);
for (int i = 0; i < array1.Length; i++)
{
if (array1Tokenized[i] != array2Tokenized[i])
{
Console.WriteLine("False");
return;
}
}
Console.Write("True");
for (int i = 0; i < array1.Length; i++)
{
bool appearedBefore = false;
for (int j = 0; j < i; j++)
{
if (array1[j] == array1[i])
{
appearedBefore = true;
break;
}
}
if (!appearedBefore && array1[i] != array2[i])
{
Console.Write(" {0} => {1}", array1[i], array2[i]);
}
}
Console.WriteLine();
}
И результаты:
static void Main(string[] args)
{
Test("ala bala portocala".ToCharArray(), "cuc dcuc efghijcuc".ToCharArray());
Test("ala bala portocala".ToCharArray(), "cuc dcuc efghfjcuc".ToCharArray());
Test("aab".ToCharArray(), "ttd".ToCharArray());
}
Вывод:
[ala bala portocala] VS [cuc dcuc efghijcuc]
False
[ala bala portocala] VS [cuc dcuc efghfjcuc]
True a => c l => u b => d p => e o => f r => g t => h c => j
[aab] VS [ttd]
True a => t b => d