[英]Reduce memory usage in the below anagram program - C#
通過輸入段落和輸出來嘗試Anagram檢查器是明確的,但內存限制超出了指定的范圍
這是我試過的代碼
using System;
class Program
{
static void Main(string[] args)
{
string[] arr = (Punct(Console.ReadLine()).ToLower()).Split(' ');
string a = string.Empty;
System.Collections.Generic.Dictionary<string, string> dn = new System.Collections.Generic.Dictionary<string, string>(); // *2
foreach (string s in arr)
{
string st = sort(s);
if (dn.ContainsKey(st))
{
if (dn[st] != s)
{
if (a.Contains(dn[st]))
a = a.Replace(dn[st], dn[st] + " " + s); // *1
else
a = a + dn[st] + " " + s + "\n";
dn[st] = s;
}
}
else
dn.Add(st, s);
}
Console.Write(a);
}
public static string sort(string s)
{
char[] chars = s.ToCharArray();
Array.Sort(chars);
return new string(chars);
}
public static string Punct(string s)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (char c in s)
{
if (!char.IsPunctuation(c))
sb.Append(c);
}
return sb.ToString();
}
}
在使用分析器檢查時,String函數也占用了大量內存和其他字典,因此,我的問題是如何將上述代碼優化到最少內存,或者我使用的任何代碼或聲明是不必要的?
輸入:
夏季,世界各地都有近24小時的陽光照射。 Dan頭上有一條帶子,以表明自己是領導者,他想知道他前面有什么樣的陷阱。
輸出:
零件表帶陷阱
丹和
我注意到幾點:
我認為我的第二點在你的情況下是最重要的。 如果你有更大的文件,有更多不同的單詞,但是相同的字謎最小的“命中率”,第一點和第三點都很重要。
嘗試最小化String操作,尤其是沒有StringBuilder的連接。 另外,只需使用C#LINQ技術:
string input = Console.ReadLine();
string[] words = (Punct(input).ToLower()).Split(' ');
var anagramStrings = words
.Distinct()
.GroupBy(sort)
.Where(anagrams => anagrams.Count() > 1)
.Select(anagrams => String.Join(" ", anagrams));
string output = String.Join("\n", anagramStrings);
Console.Write(output);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.