मैं हैकर रैंक समस्या पर काम कर रहा हूं और मानता है मेरा समाधान सही है। हालांकि, मेरे अधिकांश परीक्षण मामलों का समय समाप्त हो रहा है। क्या कोई सुझाव दे सकता है कि मेरे कोड की दक्षता में सुधार कैसे किया जाए?मैं अपने ट्राई को और अधिक कुशल कैसे बना सकता हूं?
कोड का महत्वपूर्ण हिस्सा "ट्री क्लास" से शुरू होता है।
सही प्रश्न का यहां पाया जा सकता: https://www.hackerrank.com/challenges/contacts
using System;
using System.Collections.Generic;
using System.IO;
class Solution
{
static void Main(String[] args)
{
int N = Int32.Parse(Console.ReadLine());
string[,] argList = new string[N, 2];
for (int i = 0; i < N; i++)
{
string[] s = Console.ReadLine().Split();
argList[i, 0] = s[0];
argList[i, 1] = s[1];
}
Trie trie = new Trie();
for (int i = 0; i < N; i++)
{
switch (argList[i, 0])
{
case "add":
trie.add(argList[i, 1]);
break;
case "find":
Console.WriteLine(trie.find(argList[i, 1]));
break;
default:
break;
}
}
}
}
class Trie
{
Trie[] trieArray = new Trie[26];
private int findCount = 0;
private bool data = false;
private char name;
public void add(string s)
{
s = s.ToLower();
add(s, this);
}
private void add(string s, Trie t)
{
char first = Char.Parse(s.Substring(0, 1));
int index = first - 'a';
if(t.trieArray[index] == null)
{
t.trieArray[index] = new Trie();
t.trieArray[index].name = first;
}
if (s.Length > 1)
{
add(s.Substring(1), t.trieArray[index]);
}
else
{
t.trieArray[index].data = true;
}
}
public int find(string s)
{
int ans;
s = s.ToLower();
find(s, this);
ans = findCount;
findCount = 0;
return ans;
}
private void find(string s, Trie t)
{
if (t == null)
{
return;
}
if (s.Length > 0)
{
char first = Char.Parse(s.Substring(0, 1));
int index = first - 'a';
find(s.Substring(1), t.trieArray[index]);
}
else
{
for(int i = 0; i < 26; i++)
{
if (t.trieArray[i] != null)
{
find("", t.trieArray[i]);
}
}
if (t.data == true)
{
findCount++;
}
}
}
}
संपादित करें: मैं टिप्पणी में कुछ सुझाव दिए गए थे, लेकिन एहसास हुआ कि मैं (1) के साथ s.Substring को बदल नहीं सकते [0] ... क्योंकि मुझे वास्तव में एस [1. एनएन] की जरूरत है। और एस [0] एक char लौटाता है इसलिए मुझे करने की आवश्यकता होगी। वैसे भी इसे चालू करना।
इसके अलावा, थोड़ा और जानकारी जोड़ने के लिए। विचार यह है कि उदाहरण के लिए उपसर्ग के बाद इसे सभी नामों की गणना करने की आवश्यकता है।
Input: "He"
Trie Contains:
"Hello"
"Help"
"Heart"
"Ha"
"No"
Output: 3
प्रत्यावर्तन का उपयोग नहीं की कोशिश करें, आप बना रहे हैं जब इसकी आवश्यकता नहीं होती है तो बहुत सारे स्ट्रिंग्स –
को प्रतिस्थापित करने के बजाय स्ट्रिंग से 1 char प्राप्त करने के लिए इंडेक्स का उपयोग करें, हाँ, मुझे पता है कि पुनरावृत्ति दृष्टिकोण है, लेकिन मुझे लगता है कि यह एक "पेड़ की तरह" संरचना रिकर्सन कुछ उचित होगा। मुझे लगता है कि मैं निश्चित रूप से रिकर्सन से कुछ और सहायक को याद कर रहा हूं। मैं सबस्ट्रिंग विधि हालांकि कोशिश करूँगा! क्या आप सुझाव देंगे कि मैं "स्ट्रिंगबिल्डर" का प्रयास करता हूं? –
पहले चार प्राप्त करने के लिए आप एस [0] का उपयोग कर सकते हैं। चूंकि आप पेड़ में केवल एक ही रास्ता जा रहे हैं, फिर भी रिकर्सन की आवश्यकता नहीं है और फिर आपको सबस्ट्रिंग का उपयोग करने की आवश्यकता नहीं होगी। यहां तक कि अगर आप स्ट्रिंग के अंदर चरित्र की अनुक्रमणिका को पार करते हैं तो रिकर्सन के साथ भी यह सबकुछ तेज़ नहीं हो सकता है। –