撒列實現關鍵字過慮二(附源碼)


由於第一個版本想復雜了,思路不是很清新,導致有些問題沒有攻克,過年那些天也想了很多,還是沒有解決,一直想放棄那個解決方案,可就是舍不得放棄,我做了那么多,我想了那么久,我不想重頭再來,但到最后還是沒有找到既高效又沒有明顯BUG的解決方案,最終選擇放棄第一版中的解決方案,今天本想用基於撒列的搜索樹的方式實現的,可寫了一部分代碼后發現還是有些問題,當然並不代表用基於撒列的搜索樹實現有問題,只是對於我來說有點難度,就算實現了也肯定不高效,最后也放棄了搜索樹這個方案。最后想到的一個方案就是本篇博客講的方案,思路很簡單,還是基於撒列,把每個關鍵詞的第一個字作為key,把關鍵詞作為value,把所有關鍵詞撒列在一個Dictionary<key,value>中,由於一個關鍵字可能對應多個關鍵詞,所以value其實是一個關鍵詞集合,通過遍歷要過濾的內容,與關鍵字字典進行匹配,匹配的話就過濾掉,由於思路簡單清晰,可能出現的BUG絕對很少,實現的代碼才90多行,實現關鍵字過濾的功能代碼才90多行,看到沒有!而且效率還不錯,關鍵字和要過濾的內容都一萬多字,使用的時間才10毫秒,而且這兩組數據都是從記事本中讀出來的。

 

廢話真的不想再說了,看了源碼之后你會覺得:我靠,原來這么簡單。信不信由你,反正源碼在這里

      public string Filter(string str)
{
if (string.IsNullOrEmpty(str))
{
return string.Empty;
}
int len = str.Length - 1;
char[] sb = str.ToCharArray();
bool isOK = true;
for (int i = 0; i <= len; i++)
{
if (keyDict.ContainsKey(str[i]))
{
int j = i;
foreach (string s in keyDict[str[i]])
{
foreach (char c in s)
{
if ( j >= len || c != str[j++])
{
isOK = false;
break;
}
}
if (isOK)
{
for (int k = i; k < j; k++)
sb[k] = '*';
i = j;
break;
}
else
{
j=i;
isOK = true;
}
}
}
}
return new string(sb);
}

 

測試截圖:

作者:陳太漢

博客:http://www.cnblogs.com/hlxs/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM