日期:2014-05-20  浏览次数:20866 次

算法擂台——根据文本产生字典
注意,测试数据已经上传,位于:http://download.csdn.net/source/3257888
上一个问题是不是有点难,先来一个简单的问题热身下。

考虑这样一个问题,给定一段输入文本,从中提取所有的单词,并且输出,要求输出的单词经过排序,不区分大小写,而且不重复和遗漏。

比如:"Hello World! Hello everyone, my name is caozhy!"
输出:
caozhy
everyone
hello
is
my
name
world

下面给一个我的实现:
C# code
    class DictGen
    {
        class Node
        {
            public Dictionary<char, Node> Dict { get; set; }
            public Node() { Dict = new Dictionary<char, Node>(); }

            public IEnumerable<string> Get()
            {
                foreach (var item in Dict.OrderBy(x => x.Key))
                {
                    if (item.Key == '\0') yield return "";
                    foreach (var item1 in item.Value.Get())
                    {
                        yield return item.Key.ToString().ToLower() + item1;
                    }
                }
            }
        }

        public static IEnumerable<string> ParseString(TextReader tr)
        {
            Node rootNode = new Node();
            Node currNode = rootNode;
            int state = 0;
            char[] arr;
            try
            {
                while (true)
                {
                    arr = tr.ReadLine().ToUpper().ToCharArray();
                    for (int i = 0; i < arr.GetLength(0); i++)
                    {
                        if (arr[i] >= 65 && arr[i] <= 90)
                        {
                            state = 1;
                            if (!currNode.Dict.ContainsKey(arr[i]))
                                currNode.Dict.Add(arr[i], new Node());
                            currNode = currNode.Dict[arr[i]];
                        }
                        else
                        {
                            if (state == 1)
                            {
                                if (!currNode.Dict.ContainsKey('\0'))
                                    currNode.Dict.Add('\0', new Node());
                                state = 0;
                            }
                            currNode = rootNode;
                        }
                    }
                }
            }
            catch
            { }
            return rootNode.Get();
        }
    }


------解决方案--------------------
mark,向MVP学习
------解决方案--------------------
最好能给个区分变异词,同义词的算法
------解决方案--------------------
C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (var item in GetStr("Hello World! Hello everyone, my name is caozhy!"))
            {
                Console.WriteLine(item);
            }
        }

        static IEnumerable<string> GetStr(string str)
        {
            string[] list = str.Split(new char[] { ' ', ',', '!' }, StringSplitOptions.RemoveEmptyEntries);
            return list.Distinct().OrderBy(i => i.ToLowerInvariant()).AsEnumerable();
        }
    }
}

------解决方案--------------------
这种问题我一般用c++使用STL的map,直接put,然后使用iterator输出。
O(nlogn)
------解决方案--------------------
C# code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (var item in GetStr("Hello World! Hello everyone, my name is caozhy!,ni ,hao ,...."))
            {
                Console.WriteLine(item);
            }
        }

        static IEnumerable<string> GetStr(string str)
        {         
            Regex re = new Regex(@"[a-zA-Z]+");
            List<string> list = new List<string>();
            MatchCollection mc = re.Matches(str);
            foreach (Match item in mc)
            {
                list.Add(item.Value);
            }
            return list.Distinct().OrderBy(i => i.ToLowerInvariant()).AsEnumerable();
        }
    }
}