【问题标题】:Search for one String within a different String在不同的字符串中搜索一个字符串
【发布时间】:2018-02-25 17:14:57
【问题描述】:

当我尝试比较两个字符串时遇到了一些麻烦。 我的第一个字符串是一个单词,我的第二个字符串是一些构成我的单词的字母,例如:

String 1, my word: "test"
String 2, my soup: "adhesljdtth"

在这种情况下,我得到了两个字符串的所有字符,并开始处理它们,当我在我的汤中发现一些属于我的单词的字符时,我需要从我的汤中删除它,然后转到下一个元素。

我找到了一些方法来比较它并使用以下方法获得结果:StringBuilder、LinkedList、数组等,它们都适用于小字符串,但是当我得到一个包含一百万个字符的字符串时,我遇到了一些性能问题。在这种情况下,我尝试使用二分搜索,但即使这样处理我的结果也需要很长时间。

我正在使用 Array.sort 函数对我的两个字符串进行排序。

为了验证soup 是否有所有的字母来构成我的单词,我正在这样做:

for (int i = 0; i < wordLenght; i++) {
    char key = wordCharList[i];
    int length = soupCharList.size();
    int low = 0;
    int high = length - 1;

    while (low <= high) {

        int mid = (low + high) >>> 1;
        char midVal = soupCharList.get(mid);

        if (midVal < key) {
            low = mid + 1;
        }
        else if (midVal > key) {
            high = mid - 1;
        }
        else if(midVal == key) {
            soupCharList.remove(mid);
            break;
        }
        if(high == -1) {   
            return false;
        }
    }
}
    return true;
}

您有什么想法可以将其与更好的性能进行比较吗?

【问题讨论】:

标签: java arrays string performance linked-list


【解决方案1】:

我尝试比较两个字符串

要比较字符串,请使用String#compare。显然,您正在做其他事情,因此请正确命名。

我找到了一些比较它并得到结果的方法:StringBuilder、LinkedList、数组等等,它们都适用于小字符串,但是当我得到一个包含一百万个字符的字符串时

这些数据结构都没有快速查找功能。为此,请使用 SetMap

  • 如果您想知道汤是否包含该单词中的所有字符,请使用Set#containsAll
  • 如果您想知道,如果汤包含单词中的所有字符且出现次数足够,请使用Map&lt;Character, Integer&gt;
  • 对于计数,Guava Multiset&lt;Character&gt; 更易于使用。

由于字符数被限制为一个较小的值,您可以使用包含计数的数组。这不是很笼统,但它非常简单且非常快速:

int[] wordCounts = makeCounts(word);
int[] soupCounts = makeCounts(soup);
for (int i=0; i<wordCounts.length; ++i) {
    if (wordCounts[i] > soupCount[i]) return false;
}
return true;

int[] makeCounts(String s) {
    int[] result = new int[Character.MAX_VALUE + 1];
    for (int i=0; i<s.length(); ++i) ++result[s.charAt(i)];
    return result;
}

由于您的字符串不使用所有字符,因此可以进行优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 2013-01-18
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    相关资源
    最近更新 更多