2013-11-27 1 views
1

Я хочу метод, который получает как вход two char arrays, и целое число d, которое представляет собой максимум различий между символами в обоих массивах и возвращает true или false в зависимости от if массивы похожи отличающиеся не более чем с д символовПолучите количество разных символов между двумя строками, допускающее определенное количество разностей

так, например

Имея

char[] a1 = { 's', 't', 'a', 'f', 'f' }; 
char[] a2 = { 's', 't', 'a', 'c', 'k' }; 

и имеющей D = 2 будет возвращать верно, потому что эти массивы почти аналогичный

Я думал о делает цикл и сравнивая каждый символ и имеющий счетчик maxDiference и если счетчик превышает возвращать ложь, как:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Linq; 



namespace auxros 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      char[] a1 = { 's', 't', 'a', 'f', 'f' }; 
      char[] a2 = { 's', 't', 'a', 'c', 'k' }; 
      bool areDifferent = CharMismatches(a1, a2, 1); 
      System.Console.WriteLine("The arrays are diferent at most by one char? " + areDifferent); 
      areDifferent = CharMismatches(a1, a2, 2); 
      System.Console.WriteLine("The arrays are diferent at most by two chars? " + areDifferent); 
      areDifferent = CharMismatches(a1, a2, 3); 
      System.Console.WriteLine("The arrays are diferent at most by three chars? " + areDifferent); 
     } 

     static bool CharMismatches(char[] a1, char[] a2, int d) { 
      int mismatches = 0; 
      for (int i = 0; i < a1.Length; i++) 
      { 
       if (!a1[i].Equals(a2[i])) 
       { 
        mismatches++; 
       } 
       if (mismatches == d) 
       { 
        return true; 
       } 
      }    
      if (mismatches <= d) 
      { 
       return false; 
      } 
      return true; 

     } 
    } 
} 

Есть ли более эффективный способ сделать это?

+0

Я отредактировал ваше название. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

'if (mismatches <= d) {return false;} return true;' Эта часть избыточна, просто нужно 'return false''. –

+0

@cMinor, каким должно быть поведение, когда char [] a1 = {'k', 'c', 'a', 't', 's',}; char [] a2 = {'s', 't ',' a ',' c ',' k '} ;, Вы пытаетесь сравнить char только с одним индексом? – Sameer

ответ

2

Почему бы не написать CharMismatches номер d (до макс.)?

static int CharMismatches(char[] a1, char[] a2, int max) 
{ 
    int mismatches = 0; 
    for (int i = 0; i < a1.Length; i++) 
    { 
     if (!a1[i].Equals(a2[i])) 
      if (++mismatches == max) 
       return mismatches 
    }    
    return mismatches; 
} 

Таким образом, вам нужно всего лишь запустить его однажды:

int max = 3; 
int mismatches = CharMismatches(a1, a2, max); 
System.Console.WriteLine(string.Format(
    "The arrays are different at {1} by {0} char", 
    mismatches, 
    mismatches == max ? "least" : "most" 
)); 
1

Для проверки несовпадения во всем массиве.

public class CharCount 
{ 
    public char Char { get; set; } 
    public int FirstArrayCount { get; set; } 
    public int SecondArrayCount { get; set; } 
} 

private static int CharMismatches(char[] a1, char[] a2) 
{ 
    var charCountList = new List<CharCount>(); 

    charCountList.AddRange(a1.GroupBy(a => a).Select(a => new CharCount { Char = a.Key, FirstArrayCount = a.Count() }).ToList()); 

    charCountList.AddRange(a2.GroupBy(a => a).Select(a => new CharCount { Char = a.Key, SecondArrayCount = a.Count() }).ToList()); 

    var totalCharCountList= charCountList.GroupBy(a => a.Char).ToDictionary(a => a.Key, b => new CharCount 
     { 
      Char = b.Key, 
      FirstArrayCount = b.Sum(c => c.FirstArrayCount), 
      SecondArrayCount = b.Sum(c => c.SecondArrayCount) 
     }); 

    var totalMisMatches= totalCharCountList.Count(a => a.Value.FirstArrayCount == 0 || a.Value.SecondArrayCount==0); 
    return totalMisMatches; 
} 
Смежные вопросы