private string FindFirst(string text, int index, TrieNode3 ptr) { for (int i = index; i < text.Length; i++) { var t = text[i]; TrieNode3 tn; if (ptr.TryGetValue(t, out tn) == false) { if (ptr.HasWildcard) { var result = FindFirst(text, i + 1, ptr.WildcardNode); if (result != null) { return(result); } } return(null); } if (tn.End) { var length = _keywordLength[tn.Results[0]]; var s = i - length + 1; if (s >= 0) { return(text.Substring(s, length)); } } ptr = tn; } return(null); }
public IList <IList <int> > PalindromePairs(string[] words) { List <IList <int> > res = new List <IList <int> >(); TrieNode3 root = new TrieNode3(); for (int i = 0; i < words.Length; i++) { root.Insert(new string(words[i].Reverse().ToArray()), i); } for (int i = 0; i < words.Length; i++) { foreach (int j in root.Search(words[i])) { if (i != j) { res.Add(new List <int> { i, j }); } } } return(res); }
private void Replace(string text, int index, TrieNode3 ptr, char replaceChar, StringBuilder result) { for (int i = index; i < text.Length; i++) { var t = text[i]; TrieNode3 tn; if (ptr.TryGetValue(t, out tn) == false) { if (ptr.HasWildcard) { Replace(text, i + 1, ptr.WildcardNode, replaceChar, result); } return; } if (tn.End) { var maxLength = _keywordLength[tn.Results[0]]; var start = i + 1 - maxLength; if (start >= 0) { for (int j = start; j <= i; j++) { result[j] = replaceChar; } } } ptr = tn; } }
private bool ContainsAny(string text, int index, TrieNode3 ptr) { for (int i = index; i < text.Length; i++) { var t = text[i]; TrieNode3 tn; if (ptr.TryGetValue(t, out tn) == false) { if (ptr.HasWildcard) { return(ContainsAny(text, i + 1, ptr.WildcardNode)); } return(false); } if (tn.End) { var length = _keywordLength[tn.Results[0]]; var s = i - length + 1; if (s >= 0) { return(true); } } ptr = tn; } return(false); }
private void FindAll(string text, int index, TrieNode3 ptr, List <string> result) { for (int i = index; i < text.Length; i++) { var t = text[i]; TrieNode3 tn; if (ptr.TryGetValue(t, out tn) == false) { if (ptr.HasWildcard) { FindAll(text, i + 1, ptr.WildcardNode, result); } return; } if (tn.End) { foreach (var item in tn.Results) { var length = _keywordLength[item]; var s = i - length + 1; if (s >= 0) { var key = text.Substring(s, length); result.Add(key); } } } ptr = tn; } }
private WordsSearchResult FindFirst(string text, int index, TrieNode3 ptr) { for (int i = index; i < text.Length; i++) { var t = text[i]; TrieNode3 tn; if (ptr.TryGetValue(t, out tn) == false) { if (ptr.HasWildcard) { var result = FindFirst(text, i + 1, ptr.WildcardNode); if (result != null) { return(result); } } return(null); } if (tn.End) { var r = tn.Results[0]; var length = _keywordLength[r]; var start = i - length + 1; if (start >= 0) { var kIndex = _keywordIndex[r]; var matchKeyword = _matchKeywords[kIndex]; var keyword = text.Substring(start, length); return(new WordsSearchResult(keyword, start, i, kIndex, matchKeyword)); } } ptr = tn; } return(null); }
private void FindAll(string text, int index, TrieNode3 ptr, List <WordsSearchResult> list) { for (int i = index; i < text.Length; i++) { var t = text[i]; TrieNode3 tn; if (ptr.TryGetValue(t, out tn) == false) { if (ptr.HasWildcard) { FindAll(text, i + 1, ptr.WildcardNode, list); } return; } if (tn.End) { foreach (var r in tn.Results) { var length = _keywordLength[r]; var start = i - length + 1; if (start >= 0) { var kIndex = _keywordIndex[r]; var matchKeyword = _matchKeywords[kIndex]; var keyword = text.Substring(start, length); var result = new WordsSearchResult(keyword, start, i, kIndex, matchKeyword); list.Add(result); } } } ptr = tn; } }
/// <summary> /// 在文本中查找所有的关键字 /// </summary> /// <param name="text">文本</param> /// <returns></returns> public List <WordsSearchResult> FindAll(string text) { TrieNode3 ptr = null; List <WordsSearchResult> list = new List <WordsSearchResult>(); for (int i = 0; i < text.Length; i++) { var t = text[i]; TrieNode3 tn; if (ptr == null) { tn = _first[t]; } else { if (ptr.TryGetValue(t, out tn) == false) { if (ptr.HasWildcard) { FindAll(text, i + 1, ptr.WildcardNode, list); } tn = _first[t]; } } if (tn != null) { if (tn.End) { foreach (var r in tn.Results) { var length = _keywordLength[r]; var start = i - length + 1; if (start >= 0) { var kIndex = _keywordIndex[r]; var matchKeyword = _matchKeywords[kIndex]; var keyword = text.Substring(start, length); var result = new WordsSearchResult(keyword, start, i, kIndex, matchKeyword); list.Add(result); } } } } ptr = tn; } return(list); }
/// <summary> /// 在文本中查找第一个关键字 /// </summary> /// <param name="text">文本</param> /// <returns></returns> public string FindFirst(string text) { TrieNode3 ptr = null; for (int i = 0; i < text.Length; i++) { var t = text[i]; TrieNode3 tn; if (ptr == null) { tn = _first[t]; } else { if (ptr.TryGetValue(t, out tn) == false) { if (ptr.HasWildcard) { var result = FindFirst(text, i + 1, ptr.WildcardNode); if (result != null) { return(result); } } tn = _first[t]; } } if (tn != null) { if (tn.End) { var length = _keywordLength[tn.Results[0]]; var s = i - length + 1; if (s >= 0) { return(text.Substring(s, length)); } } } ptr = tn; } return(null); }
/// <summary> /// 在文本中查找所有的关键字 /// </summary> /// <param name="text">文本</param> /// <returns></returns> public List <string> FindAll(string text) { TrieNode3 ptr = null; List <string> result = new List <string>(); for (int i = 0; i < text.Length; i++) { var t = text[i]; TrieNode3 tn; if (ptr == null) { tn = _first[t]; } else { if (ptr.TryGetValue(t, out tn) == false) { if (ptr.HasWildcard) { FindAll(text, i + 1, ptr.WildcardNode, result); } tn = _first[t]; } } if (tn != null) { if (tn.End) { foreach (var item in tn.Results) { var length = _keywordLength[item]; var s = i - length + 1; if (s >= 0) { var key = text.Substring(s, length); result.Add(key); } } } } ptr = tn; } return(result); }
/// <summary> /// 在文本中替换所有的关键字 /// </summary> /// <param name="text">文本</param> /// <param name="replaceChar">替换符</param> /// <returns></returns> public string Replace(string text, char replaceChar = '*') { StringBuilder result = new StringBuilder(text); TrieNode3 ptr = null; for (int i = 0; i < text.Length; i++) { TrieNode3 tn; if (ptr == null) { tn = _first[text[i]]; } else { if (ptr.TryGetValue(text[i], out tn) == false) { if (ptr.HasWildcard) { Replace(text, i + 1, ptr.WildcardNode, replaceChar, result); } tn = _first[text[i]]; } } if (tn != null) { if (tn.End) { var maxLength = _keywordLength[tn.Results[0]]; var start = i + 1 - maxLength; if (start >= 0) { for (int j = start; j <= i; j++) { result[j] = replaceChar; } } } } ptr = tn; } return(result.ToString()); }
public void Insert(string word, int index) { var n = this; for (int i = 0; i < word.Length; i++) { if (IsPalindrome(word, i, word.Length - 1)) { n.IsRemaingPalindrome.Add(index); } char c = word[i]; if (n[c] == null) { n[c] = new TrieNode3(); } n = n[c]; } n.IsWord = true; n.Index = index; n.IsRemaingPalindrome.Add(index); }