- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这个标题有点尴尬;我真的不确定如何总结这一点。我知道我该怎么做,我只是不确定如何有效地做到这一点。这是我的问题:
我有一个字符串作为输入。比方说:
foo bar
我有一组非常大的字符串(数万个)。比方说:
foo, baz, bar, blah, foo bar, foo baz
我需要将输入与集合中的字符串相匹配。在这种情况下,“foo”、“bar”和“foo bar”被视为匹配项。
因此,我需要以某种方式搜索输入的所有排列(它可能超过 2 个单词),或者以某种方式检测用户是否打算将其(或其中的一部分)放在引号中。或者也许做一些我没有想到的事情。
我可以使用某种数据结构或算法吗?我应该怎么做,或者我不应该处理这个用例?
编辑:上面的错别字扭曲了问题;在上面的示例中,“foo baz”也是一个匹配项。对于那个很抱歉。我基本上想将输入单词的任何排列与字典匹配。因此,输入“abc xyz”会匹配“123 abc”或“abc xyz”或“xyz 123”,但不会匹配“abcxyz”。
最佳答案
我建议使用字典。使用字符串作为键,使用字符串列表作为值。标记将要搜索的字符串,并为每个标记将整个字符串添加到您的字典一次。 (您可以使用 split 方法来标记您的字符串。使用空格作为分隔符。)此后,每当您需要进行查找时,您可以标记搜索字符串并在字典中查找每个标记。
因此,如果您添加了以下字符串:foo、baz、bar、blah、foo bar、foo baz
你的字典有条目:
foo: foo, foo bar, foo baz巴兹:巴兹,富巴兹酒吧:酒吧,酒吧啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦
你是否应该搜索“foo bar”,
您的输出是存储在 foo 和 bar 下的条目的并集,如下所示:"foo bar":= foo, bar
foo: foo, foo bar, foo baz联盟酒吧:酒吧,酒吧
给予:foo, foo bar, foo baz, bar
编辑:我刚刚注意到您只需要完整或部分匹配,即 foo baz 是 Not Acceptable 。简单的解决方案是对结果进行后处理——将搜索字符串和目标字符串中较长的字符串限制为较短字符串的长度,然后将截断的字符串与未修改的字符串进行比较。只接受等价的。
编辑:事实证明 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;
}
}
给定一个包含 m 个字符串的字典,每个字符串有 q 个单词和 n 个唯一单词,以及一个包含 l 个单词的搜索字符串,时间复杂度如下:
填充数据结构:O(qmT[dictionary-insert])。需要对每个词进行一次插入
查找字符串:O(l*T[dictionary-find])。搜索字符串中每个单词的字典查找。
实际成本取决于您的字典实现。基于哈希表的字典在插入和查找时都会产生 O(1) 的成本。基于二叉树的字典的插入和查找成本均为 O(lg n)。
关于java - 在字符串集中搜索字符串排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1428348/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!