私はこの問題をGoogle foobarで処理しています。 "与えられたすべての検索語を含む文書の最短スニペットを返すanswer(document、searchTerms)という関数を書く。検索語は任意の順序で出現できる。" スニペットの長さはスニペット内の単語の数です単語のリストを含む文字列の最短スニペット
私のソリューションは2つのテストケースで失敗します(どちらにも言わない)と私が間違っていることがわかりません。私は数十の異なるシナリオをテストし、それらのすべてのシナリオで動作します。
文書内のすべての単語はスペースで区切られています。少なくとも1つの検索語と少なくとも1語が文書にあります。検索用語は明確であり、文書に少なくとも1回出現することが保証されています。
複数のスニペットが最短の場合は、最初のスニペットを返します。
例:答え( "FOO fooという非常にバーfooのバー"、{ "foo" という、 "バー"}) 答えは "バーfoo" という
である私は他の記事を見て、同様のアルゴリズムを発見し、あるき私の違いは? method to find the shortest substring containing the given words:optimization required
public static String answer(String document, String[] searchTerms) {
String[] doc = document.split(" ");
int docLength = doc.length;
int termsTotal = searchTerms.length;
Map<String, Integer> searchTermsMap = new HashMap<>();
for (int i = 0; i < docLength; i++) {
String word = doc[i];
if (containsSearchTerm(word, searchTerms)) {
searchTermsMap.put(word, i);
if (searchTermsMap.size() == termsTotal) {
int max = 0;
int min = Integer.MAX_VALUE;
for (Integer value : searchTermsMap.values()) {
max = Math.max(max, value);
min = Math.min(min, value);
}
if (max - min < currentLast - currentStart) {
currentStart = min;
currentLast = max;
}
}
}
}
StringBuilder result = new StringBuilder();
result.append(doc[currentStart]);
for (int i = currentStart + 1; i <= currentLast; i++) {
result.append(" ").append(doc[i]);
}
return result.toString();
}
private static boolean containsSearchTerm(String word, String[] searchTerms) {
for (String term : searchTerms)
if (word.equals(term))
return true;
return false;
}
部分文字列の長さで最短ではなく、短い単語を検索しています。あなたが 'bar ab foo'でなければならない' 'foo longword bar'(3単語、16文字)を返します。単語、11文字)。 – Andreas
質問の正確な表現は、「スニペットの長さ」です。 "それは曇っています"は長さ3のスニペットです。単語数ではなく、文字ではなく – user1738539
のサンプルテストケースです。 テストケース ========== 入力: を(文字列)文書= (文字列リスト)のSearchTerms = [ "グーグル"、 "プログラムの"] "多くのGoogleの従業員は、プログラムすることができます" 出力: (文字列) 入力 "Googleの従業員は、プログラムすることができます": (文字列)文書= "ABCDA" (文字列のリスト)のSearchTerms = [ "A"、 "C"、 "D"] 出力: (文字列) "cda" – user1738539