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