입니다. 문자열을 키로 사용하고 문자열 목록을 값으로 사용하십시오. 검색 할 문자열을 토큰 화하고 각 문자열에 대해 전체 문자열을 사전에 추가하십시오. (Youn은 split 메소드를 사용하여 문자열을 토큰화할 수 있으며, 공백을 구분 기호로 사용하십시오.) 이후 조회가 필요할 때마다 검색 문자열을 토큰 화하고 사전의 각 토큰을 조회합니다. foo는, 바즈, 바, 어쩌구, foo는 바, foo는 바즈
귀하의 사전 항목이 있습니다 :
foo는 : foo는, 푸 바, foo는 바즈 바즈 다음과 같은 문자열을 추가 한 따라서 경우
: 바즈, foo는 바즈 바 : 바, foo는 바 ㅋ ㅋ : ㅋ ㅋ
당신은 다음
당신의 출력이 항목 foo는 아래에 저장하고 같은 바의 결합이다 "foo는 바"를 검색해야 그래서 : 는 "foo는 바는"foo는, 바에게 =
foo는 : foo는, 푸 바, foo는 바즈 조합 바 : 바, foo는 바
주는 : foo는, 푸 바, foo는 바즈, 바
편집 : 나는 단지 당신이 전체 또는 부분 일치만을 원한다는 것을 알아 차렸다. 즉, foo baz는 받아 들일 수 없다.쉬운 솔루션은 결과를 게시 처리하는 것입니다. 검색 문자열과 대상 문자열을 더 긴 길이로 제한하고 잘린 문자열을 수정되지 않은 문자열과 비교하십시오. 동등한 것만 수락하십시오.
EDIT : 그래서 foo baz가 실제로 일치합니다. 위 단락을 무시하십시오 (첫 번째 편집). 참조 (C#을) 코드는 다음과 같이
는
class DictionarySearch
{
private Dictionary<string, List<string>> dict;
public DictionarySearch()
{
dict = new Dictionary<string, List<string>>();
}
/// <summary>
/// Add a string e.g. foo bar to the dictionary
/// </summary>
/// <param name="s">string to be added</param>
public void addString(string s)
{
//tokenize string
string[] words = s.Split(new char[] { ' ' });
//add each token to the dictionary as a key with the matching value being s
foreach (string w in words)
{
if (dict.ContainsKey(w))
{
dict[w].Add(s);
}
else
{
dict.Add(w, new List<string>());
dict[w].Add(s);
}
}
}
/// <summary>
/// Find all strings which match at least one token
/// </summary>
/// <param name="s">string of tokens (words) to be matched</param>
/// <returns>List of strings matching at least one word</returns>
public IList<string> getMatches(string s)
{
//split search string into words
string[] words = s.Split(new char[] { ' ' });
List<string> output = new List<string>();
//retrieve from dictionary list of strings matching each word.
foreach (string w in words)
{
if (dict.ContainsKey(w))
{
output.AddRange(dict[w]);
}
else
{
continue;
}
}
return output;
}
}
시간 복잡성이다 Q 문자열 당 단어와 n 개의 고유 한 말과 리터의 단어와 함께 검색 문자열과 m의 문자열 사전을 감안할 때 다음과 같이
데이터 구조 채우기 : O (q m T [사전 삽입]). 각 단어에 대해 삽입을 수행해야합니다.
문자열 찾기 : O (l * T [사전 찾기]). 검색 문자열에서 단어 당 사전 조회.
실제 비용은 사전 구현에 따라 다릅니다. 해시 테이블 기반 사전은 삽입 및 검색 모두에 대해 O (1) 비용을 발생시킵니다. 이진 트리 기반 사전은 삽입 및 검색 모두에 대해 O (lg n) 비용을 발생시킵니다.
이 문자열 영어 단어 또는 그들이 어떤 문자를 포함 할 수 있습니다? 대소 문자를 구분합니까? – Adamski
@Adamski 영어 단어이므로 대소 문자를 구분하지 않습니다. 그러나 그들은 사전에서 찾을 수없는 것들과 같은 매우 기술적 인 단어입니다. –
사전에 "foob"이 포함되어있는 경우 "foo"를 검색하거나 정확한 일치에만 관심이 있다면 반환하겠습니까? – Adamski