は、私は、問題のパフォーマンスのベンチマークを満たしていないこれら2つの方法の複雑さをどのように減らすことができますか?
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
class Solution
{
// returns true or false based on whether s1 and s2 are
// an unordered anagrammatic pair
// e.g. "aac","cac" --> false
// "aac","aca" --> true
// Complexity: O(n)
static bool IsAnagrammaticPair(string s1, string s2)
{
if(s1.Length != s2.Length)
return false;
int[] counter1 = new int[26],
counter2 = new int[26];
for(int i = 0; i < s1.Length; ++i)
{
counter1[(int)s1[i] - (int)'a'] += 1;
counter2[(int)s2[i] - (int)'a'] += 1;
}
for(int i = 0; i < 26; ++i)
if(counter1[i] != counter2[i])
return false;
return true;
}
// gets all substrings of s (not including the empty string,
// including s itself)
// Complexity: O(n^2)
static IEnumerable<string> GetSubstrings(string s)
{
return from i in Enumerable.Range(0, s.Length)
from j in Enumerable.Range(0, s.Length - i + 1)
where j >= 1
select s.Substring(i, j);
}
// gets the number of anagrammatical pairs of substrings in s
// Complexity: O(n^2)
static int NumAnagrammaticalPairs(string s)
{
var substrings = GetSubstrings(s).ToList();
var indices = Enumerable.Range(0, substrings.Count);
return (from i in indices
from j in indices
where i < j && IsAnagrammaticPair(substrings[i], substrings[j])
select 1).Count();
}
static void Main(String[] args)
{
int T = Int32.Parse(Console.ReadLine());
for(int t = 0; t < T; ++t)
{
string line = Console.ReadLine();
Console.WriteLine(NumAnagrammaticalPairs(line));
}
}
}
のようないくつかのコードを持っています。 2つのヘルパー・メソッドは、私は、しかし、私は私が取得に関わる操作の数を減らすことができる方法を見ていない、私はコメントで述べたように、私はO(n^2)
いることを知っている
GetSubstrings
と
NumAnagrammaticalPairs
を持っています回答。何か案は?
それはかつてはO(n^3)を行うので、 'NumAnagrammaticalPairs'は、' IsAnagrammaticPair'を呼び出し –
私はあなたが 'GetSubstrings'&' NumAnagrammaticalPairs'の複雑さを低減することができると思ういけません。 Linqとenumerablesを使用する代わりに、通常の2つのforステートメントを使用するなど、いくつかの改良を加えることができます。それが十分であるかどうかわからない場合 –
または両方の方法を破棄することができます。 https://www.topcoder.com/community/data-science/data-science-tutorials/dynamic-programming-from-novice-to-advanced/ –