测试字符串是否是字符串列表中任何字符串的子字符串的有效方法

时间:2016-01-17 01:48:39

标签: java time-complexity string-comparison

我想知道将字符串与字符串列表进行比较的最佳方法。这是我脑海中的代码,但很明显,它在时间复杂度方面并不好。

for (String large : list1) {
    for (String small : list2) {
        if (large.contains(small)) {
            // DO SOMETHING
        } else {
            // NOT FOR ME
        }
    }

    // FURTHER MANIPULATION OF STRING 
}

两个字符串列表都可以包含超过一千个值,因此最坏情况下的复杂度可能会增加到1000×1000×长度,这是一个烂摊子。在上面给出的场景中,我想知道执行将字符串与字符串列表进行比较的最佳方法。

3 个答案:

答案 0 :(得分:1)

你可以这样做:

 for (String small : list2) {
    if (set1.contains(small)) {
        // DO SOMETHING
    } else {
        // NOT FOR ME
    }
}

set1应该是较大的String列表,而不是将其保留为List<String>,请使用Set<String>HashSet<String>

答案 1 :(得分:0)

感谢sandeep的第一个回答。这是解决方案:

List<String> firstCollection = new ArrayList<>();
Set<String> secondCollection = new HashSet<>();

//POPULATE BOTH LISTS HERE.

for(String string: firstCollection){
    if(secondCollection.contains(string)){
        //YES, THE STRING IS THERE IN THE SECOND LIST
    }else{
        //NOPE, THE STRING IS NOT THERE IN THE SECOND LIST
    }
}

答案 2 :(得分:-1)

不幸的是,这是一个困难和混乱的问题。这是因为您要检查一个小字符串是否是一串大字符串的子字符串,而不是检查小字符串是否等于一堆大字符串。

最佳解决方案取决于您需要解决的问题,但这是合理的首次尝试:

在临时位置,将所有大字符串连接在一起,然后在这个长连接字符串上构造一个suffix tree。有了这个结构,我们应该能够快速找到所有small中任何给定large的所有子串匹配。