C# - 查找适用的前缀

时间:2009-11-17 06:56:10

标签: c# algorithm

只是在寻找以下问题的最佳方法方面寻求一些帮助:

我有一堆拨打过的电话号码,不要以为你需要我给你看,但是比如说。

006789 1234
006656 1234
006676 1234
006999 1234
007000 1234
006999 6789

现在:我还有一个前缀列表(前缀是首先拨打的位,也告诉你呼叫的去向(重要位))。重要的是 - 它们具有前导0,并且它们具有不同的长度。

比如说。

006789 = australia
006789 = russia
006656 = france
006676 = austria
0069 = brazil
00700 = china

所以我要做的就是编写C#算法来查找要应用的前缀。

逻辑如下工作,比如我们有一个拨打的号码和这些前缀

dialled number:0099876 5555 6565,
prefix1: 0099876 = Lyon (France)
prefix2: 0099 = France

现在两个前缀都适用,除了“更详细的一个”总是获胜。即这个电话是里昂(法国),0099876应该是结果,即使0099也适用。

让我开始使用这个算法的任何帮助都会很棒,因为看着它,我不确定我是否应该比较字符串或整数!我有.Contains字符串,但正如我的示例中所描述的那样,如果前缀在后面的数字

,则不能正常工作

6999 6978
6978 1234

干杯!!!

5 个答案:

答案 0 :(得分:8)

看起来对我来说是trie的一个很好的匹配。鉴于你的前缀保证很短,这应该很好,快速搜索。你也可以同时找到所有匹配的前缀。最长的前缀是在trie中匹配的最后一个,并且将是O(m)来查找(最坏情况),其中m是前缀的长度。

答案 1 :(得分:4)

我猜你可以按长度排序你的前缀(最长的)。

然后,当您需要处理一个数字时,您可以按顺序运行前缀,并在yourNumber.startsWith(prefix)为真时停止。

答案 2 :(得分:3)

找到最长的。使用LINQ:

prefixes.Where(p => number.StartsWith(p)).OrderByDescending(p => p.Length).FirstOrDefault();

答案 3 :(得分:0)

如果您已经知道要查找的前缀,最好使用HashMap(我相信它是C#中的字典)来存储前缀及其对应的国家/地区。然后,对于每个进入的数字,您可以对列表中的所有前缀进行标准搜索。将匹配的列表存储在列表中,然后选择最长的匹配项。

答案 4 :(得分:0)

另一种方法是将拨打的号码从右侧缩短一个,并测试该号码是否在列表中:

Dictionary<string, string> numbers = new Dictionary<string, string>();

//Build up the possible numbers from somewhere
numbers.Add("006789", "australia");
numbers.Add("006790", "russia");
numbers.Add("006656", "france");
numbers.Add("006676", "austria");
numbers.Add("0069", "brazil");
numbers.Add("00700", "china");
numbers.Add("0099876", "Lyon (France)");
numbers.Add("0099", "France");

//Get the dialed number from somewhere
string dialedNumber = "0099 876 1234 56";

//Remove all whitespaces (maybe minus signs, plus sign against double zero, remove brackets, etc)
string normalizedNumber = dialedNumber.Replace(" ", "");

string searchForNumber = normalizedNumber;
while (searchForNumber.Length > 0)
{
    if(numbers.ContainsKey(searchForNumber))
    {
        Console.WriteLine("The number '{0}' is calling from {1}", dialedNumber, numbers[searchForNumber]);
        return;
    }
    searchForNumber = searchForNumber.Remove(searchForNumber.Length - 1);
}

Console.WriteLine("The number '{0}' doesn't contain any valid prefix", dialedNumber);