我試圖發現模式:最有效的方法來搜索字符串中的未知模式?
- 發生不止一次
- 超過100個字符長
- 沒有任何其他已知的圖案
的子不知道任何的可能發生的模式。
例如:
- 字符串 「男孩倒在鍾」 將返回
'ell', 'the b', 'y '
。 - 字符串「男孩倒下了鍾,男孩倒下了鍾」將返回
'the boy fell by the bell'
。
採用雙層for循環,可以蠻力強行非常低效:
ArrayList<String> patternsList = new ArrayList<>();
int length = string.length();
for (int i = 0; i < length; i++) {
int limit = (length - i)/2;
for (int j = limit; j >= 1; j--) {
int candidateEndIndex = i + j;
String candidate = string.substring(i, candidateEndIndex);
if(candidate.length() <= 1) {
continue;
}
if (string.substring(candidateEndIndex).contains(candidate)) {
boolean notASubpattern = true;
for (String pattern : patternsList) {
if (pattern.contains(candidate)) {
notASubpattern = false;
break;
}
}
if (notASubpattern) {
patternsList.add(candidate);
}
}
}
}
然而,隨着噸的搜索模式的大字符串時,這是令人難以置信的慢。
從某種意義上說,這是一種壓縮形式。您可能會對各種壓縮算法進行一些研究。 –
爲什麼單個空間不是您的第一個結果示例中的元素? –
@Björn因爲它只有一個字符。 –