Tôi đang làm việc về vấn đề xếp hạng của hacker và tôi tin giải pháp của tôi là chính xác. Tuy nhiên, hầu hết các trường hợp thử nghiệm của tôi đang hết thời gian chờ. Có thể một số đề nghị làm thế nào để cải thiện hiệu quả của mã của tôi?Làm thế nào tôi có thể làm cho trie của tôi hiệu quả hơn?
Phần quan trọng của mã bắt đầu tại "Lớp Trie".
Câu hỏi chính xác có thể được tìm thấy ở đây: 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++;
}
}
}
}
EDIT: tôi đã làm một số gợi ý trong các ý kiến nhưng nhận ra rằng tôi không thể thay thế s.Substring (1) với s [0] ... bởi vì tôi thực sự cần s [1.n]. AND s [0] trả về một char vì vậy tôi sẽ cần phải làm. ToString trên nó anyways.
Ngoài ra, để thêm một chút thông tin. Ý tưởng là nó cần phải đếm TẤT CẢ các tên sau một tiền tố ví dụ.
Input: "He"
Trie Contains:
"Hello"
"Help"
"Heart"
"Ha"
"No"
Output: 3
Cố gắng không sử dụng đệ quy, bạn đang tạo Có quá nhiều chuỗi khi không cần thiết, sử dụng chỉ mục để lấy 1 char từ chuỗi thay vì chuỗi con –
Vâng, tôi biết có cách tiếp cận lặp lại nhưng tôi cảm thấy vì đây là một cấu trúc "giống cây" đệ quy sẽ là một số thích hợp. Tôi cảm thấy như tôi chắc chắn thiếu một cái gì đó khác bên cạnh đệ quy mặc dù. Tôi sẽ cung cấp cho các phương pháp chuỗi con một thử mặc dù! Bạn có gợi ý tôi thử "StringBuilder" không? –
Để lấy char đầu tiên, bạn có thể sử dụng s [0]. Vì bạn đang đi chỉ có một con đường trong cây không cần đệ quy và sau đó bạn sẽ không cần phải sử dụng chuỗi con. Ngay cả với đệ quy nếu u chuyển xuống chỉ số của nhân vật bên trong chuỗi không phải là chuỗi con nó có thể nhanh hơn. –