阅读句子以制作字典或数组或关键字/关键字列表

时间:2017-05-14 10:21:18

标签: c# algorithm dynamic-programming memoization

这就是问题,比如我们有这样一句话:

  

一次或多次

句子在空格的基础上分开。

这个想法是创建一个字典或数组或列出任何合适的,从上面包含所有单词的唯一和增加顺序,可以是关键字或关键短语。 所以我应该得到这样的东西:

one 
or 
more 
time
one or 
one or more 
one or more time
more time
...etc so on

但这些不是:

time more 
or time 
one time
more or
etc

这是我试过的:

private void AddWordsInDictionary(string phrase, ref Dictionary<string, string> dctKeywords)
{
    var keyWords = phrase.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).Where(x => x.Trim() != string.Empty).ToList();

    foreach (var keyword in keyWords)
    {
        if(!dctKeywords.ContainsKey(keyword))
        {
            foreach (var key in dctKeywords)
            {
                dctKeywords.Add(key + " " + keyword, key + " " + keyword);
            }
        }
        else
            AddWordsInDictionary(keyword, ref dctKeywords);
    }

}

但它不断返回一个空白字典,我也不知道算法是否是最优的,请帮忙。

1 个答案:

答案 0 :(得分:2)

找到了解决方案。

private static void AddWordsInDictionary(string phrase, ref Dictionary<string, string> dctKeywords)
{

    var keyWords = phrase.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries).Where(x => x.Trim() != string.Empty).ToList();

    Dictionary<string, string> dct = new Dictionary<string ,string>();
    int id = 0;

    string newPhrase = "";
    foreach (var keyword in keyWords)
    {
        dct[id.ToString()] = keyword;
        newPhrase = newPhrase + id.ToString();
        id++;
    }

    int xx = 0;

    while (xx < newPhrase.Length)
    {
        for (int idx = 0; idx <= newPhrase.Length; idx++)
        {
            if ( idx - xx > 0)
            {
                var item = newPhrase.Substring(xx, idx - xx).ToString();
                StringBuilder sb = new StringBuilder();
                foreach (var itm in item)
                {
                    sb.Append(dct[itm.ToString()] + " ");
                }
                var key = sb.ToString().Trim();
                dctKeywords[key] = key;
            }
        }
        xx++;
    }

}