私は解決している二つの文字列の HackerRankに問題を
ここで問題があります。
彼らは共通部分を共有する場合を考えると2つの文字列が、決定します。ストリングは1つの文字として小型ようなものであってもよいです。
例えば、言葉「」、「および」、「アート」共通部分文字列。言葉は「あること」と「猫」のサブストリングを共有することはありません。
機能説明
以下のエディタで関数twoStringsを完了します。これは、YESまたはNOの文字列が共通部分を共有するかどうかに基づいて、文字列を返すべきではありません。
twoStringsは、次のパラメータ(複数可)を持っています:
S1、S2:分析するための二つの文字列。
出力フォーマット
文字列の各ペアについて、YESまたはNOを返します。
超長い文字列が施されているときしかし、私のコードは、制限時間内に実行されません。効率を改善するための任意の提案ですか?私は、ストリームAPIを使用して見つけるのサブストリング向上させることができると思います。しかし、私は、このコンテキストでそれを使用するかどうかはわかりません。誰かが私はこれをよりよく理解するために助けてくださいもらえますか?
public static void main(String[] args) {
String s1 = "hi";
String s2 = "world";
checkSubStrings(s1, s2);
}
static void checkSubStrings(String s1, String s2) {
Map<String, Long> s1Map = new HashMap<>();
Map<String, Long> s2Map = new HashMap<>();
findAllSubStrings(s1, s1Map);
findAllSubStrings(s2, s2Map);
boolean isContain = s2Map.entrySet().stream().anyMatch(i -> s1Map.containsKey(i.getKey()) );
if (isContain) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
static void findAllSubStrings(String s, Map<String, Long> map) {
for (int i = 0; i < s.length(); i++) {
String subString = s.substring(i);
for (int j = subString.length(); j > 0; j--) {
String subSubString = subString.substring(0, j);
if (map.containsKey(subSubString)) {
map.put(subSubString, map.get(subSubString) + 1);
} else {
if (!subSubString.equals(""))
map.put(subSubString, 1L);
}
}
}
}
更新
私はちょうどHashSetsを使用して質問を解きます。
私はセットを使用して、コードを最適化。今では非常に大規模な文字列で実行されます。
static String twoStrings(String s1, String s2) {
String result = null;
Set<Character> s1Set = new HashSet<>();
Set<Character> s2Set = new HashSet<>();
for(char a : s1.toCharArray()){
s1Set.add(a);
}
for(char a : s2.toCharArray()){
s2Set.add(a);
}
boolean isContain = s2Set.stream().anyMatch(s1Set::contains);
if(isContain){
result = "YES";
} else {
result = "NO";
}
return result;
}
2つの文字列がN(> = 2)部分文字列を共有している場合(あなたが共通部分の末尾から文字を刻むことができ、そしてこれはまだ両方の文字列に記載されていますので)、彼らはまた、サブストリングN-1文字を共有しています。この引数を拡張すると、彼らはまた、1文字の部分文字列を共有しています。
そのように、あなたがチェックする必要があるすべては、単一文字のストリングです。
代わりに、単一文字のストリングを使用してマップを記入し、不必要な部分文字列を作成する(およびチェック)を回避します。(そして、ちょうど代わりに地図のセットを使用、あなたはカウントを使用することはありません)。
// Yields a `Set<Integer>`, which can be used directly to check.
return s.codePoints().boxed().collect(Collectors.toSet());