优化此代码以获得大量输入

时间:2013-08-09 17:48:23

标签: c# optimization

我有这个解决方案适用于较小的输入,例如长度高达350的输入字符串,超出它的运行时错误。输入约束为0<输入< 500。

此问题来自https://www.hackerrank.com/contests/quantium/challenges/k-mismatch

如何优化此代码以处理长度达500的字符串?

语言c#

  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;
  class Solution {
static int mismatch(string a, string b)
    {
        int result = 0;    
        for (int i = 0; i < a.Length; i++)
           if (a[i] != b[i])
               result++;
        return result;
    }
    static void Main(string[] args)
    {
        long no = 0;
        int K = int.Parse(Console.ReadLine());
        string word = Console.ReadLine();
        List<string> wordList = new List<string>();
        List<string> curr = new List<string>();

        var query =
             from i in Enumerable.Range(0, word.Length)
             from j in Enumerable.Range(0, word.Length - i + 1)
             where j >= 1
             select word.Substring(i, j);


        for (int i = 1; i < word.Length; i++)
        {
            foreach (string s in query) { if (s.ToString().Length == i)curr.Add(s);  }
            if (curr.Count() > 1) 
                for (int j = 0; j < curr.Count(); j++)
                    for (int k = j + 1; k < curr.Count(); k++)
                        if (mismatch(curr.ElementAt(j).ToString(),      curr.ElementAt(k).ToString()) <= K)
                        no++;
                curr.Clear();

        }
Console.WriteLine(word.Length+":"+no);

    }
}

1 个答案:

答案 0 :(得分:2)

我在这里看到的主要限制因素是,您计算特定字符串的每个子字符串,然后将整个查询实现到列表中(使用行{{1} }})。对于非平凡大小的字符串,这将消耗 lot 的内存。不将其转换为列表而是通过查询本身来预测将允许您传输该信息,从而大大减少您的内存占用。因为你为每个字母迭代它,没有实现它意味着计算每个值N次,这将减慢程序。由于你没有足够的内存,你别无选择,只能忍受这种减速(除非你可以改进底层算法,不需要多次执行如此大而复杂的查询)。