2014-02-08 4 views
0

я написал следующее isUniqueCharsInStringКак уменьшить пространство сложность «isUniqueString»

public static bool isUniqueCharsInString(String str) 
     { 
      int[] charsCount = new int[256]; 
      for (int i = 0; i < charsCount.Length; i++) 
      { 
       charsCount[i] = 0; 
      } 
      for (int i = 0; i < str.Length; i++) 
      { 
       int val = str[i]; 
       charsCount[val] = charsCount[val] + 1; 
       if (charsCount[val] > 1) 
       { 
        return false; 
       } 

      } 
      return true; 

     } 

Хотя он работал well.How я мог уменьшить ее сложность, так что минимальный объем памяти может быть использован во время выполнения. С уважением.

+1

Вы понимаете, что этот код не работает для символов вне (расширенного) диапазона ASCII? –

+0

Да, я знаю, что – user3266922

ответ

0

Чтобы минимизировать сложность использования пространства byte[] или bool для вашего charsCount или даже лучше BitArray, так как только вы используете его для установки флагов:

public static bool isUniqueCharsInString(String str) 
{ 
    var charsCount = new BitArray(256); 
    for (int i = 0; i < str.Length; i++) 
    { 
     int val = str[i]; 
     if (charsCount[val]) 
     { 
      return false; 
     } 
     charsCount[val] = true; 
    } 
    return true; 
} 

Интересный альтернативный подход с использованием LINQ:

public static bool isUniqueCharsInString1(String str) 
{ 
    return str.ToCharArray().GroupBy(c => c).All(g => g.Count() <= 1); 
} 

Он менее оптимизирован как в пространстве, так и во времени, но гораздо более кратким и понятным.

Из-за любопытства: почему вас так беспокоит сложность пространства? В исходной реализации используется только массив размером 1 КБ (256 * 4 В).

+0

это был всего лишь один пример, в котором я имел дело с чрезвычайно большой строкой символов, так как ваш код мне трудно понять, если у вас есть время в будущем, пожалуйста, немного уточните его. Thanx – user3266922

+1

@ user3266922 возможно, второй? Сначала он преобразует строку в 'IEnumerable ', чтобы иметь возможность использовать LINQ, затем группирую коллекцию по отдельным символьным значениям, а на последнем шаге я подсчитываю количество вхождений для каждого другого символа, возвращая false, как только происходит больше чем один раз. –

+0

Красиво сделано. Это напомнило мне предложение group by в SQL. – user3266922

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