【问题标题】:Match a string in multiple words匹配多个单词中的字符串
【发布时间】:2012-07-19 11:24:29
【问题描述】:

我找到了很多关于如何匹配字符串中的多个模式的解决方案,但没有找到如何匹配多个单词中的单个字符串。

到目前为止,我所知道的最好的方法是对每个单词使用 KMP 算法,但这不是那么有效(复杂度 = 单词长度的总和),所以我正在寻找一些更好的算法来做到这一点.

【问题讨论】:

    标签: string algorithm substring


    【解决方案1】:

    您从根本上误解了这个问题。您可以轻松地将问题分解为查找单词中所有出现的字符串。这是通过将每个单独的字符串组合成一个大字符串(或单词)来完成的。然后您可以遍历这个较大的字符串一次并使用有效的算法,例如 KMP 或正则表达式(虽然不一定推荐使用正则表达式)。一个例子来说明我的意思:

    List<String> stringList = new ArrayList<String>();
    
        String first = "abc";  
        String second = "def";  
        String third = "xyz";  
        stringList.add(first);  
        stringList.add(second);  
        stringList.add(third);  
    
    for(String string : stringList)  
    {  
        kmp(string);  
    } 
    

    等价于:

    List<String> stringList = new ArrayList<String>();  
    stringList.add("abcdefxyz");  
    for(String string : stringList)  
    {  
       kmp(string);   
    }  
    

    正如 Kevin 在 cmets 中指出的那样,此处使用分隔符可以防止生成不正确的结果。

    【讨论】:

    • 但这又如何:在“basic”或“atom”中都找不到“cat”这个词;但它可以在组合字符串“basicatom”中找到。所以你的两个代码示例并不严格等价。
    • @Kevin 当然我会承认这一点,添加分隔符将解决该问题
    • 我目前发现的如下:
    • 到目前为止我发现的优化如下:根据长度对所有字符串进行排序(越大越好)。尝试查找位置 n 处的字符串是否是位置 n-1 处的字符串的子字符串。这将是预计算步骤。然后,当我必须在我的字典中搜索一个字符串时,我将从他的结尾开始。如果我的字符串是数组中某个字符串的子字符串,我们称这个字符串为 S,那么我的字符串将是数组中所有以 S 作为子字符串的字符串的子字符串。但我只是好奇是否有更好的方法。
    猜你喜欢
    • 2010-12-15
    • 2014-03-04
    • 2015-04-08
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多