この質問は、z-functionを線形時間で単純に解決できます。
int NumberOfcopies(String t, String h){
// t = the first string i.e "ooo"
// h = the second string i.e "wooooooooooooooooooooow"
String s = t + "$" + h; // adding a sentinel character in between
int n = s.length(); // length of new string
int[] z = new int[n]; // z array
// Code ref : http://e-maxx-eng.github.io/string/z-function.html
int l = 0, r = 0;
for (int i = 1; i < n; i++){
if (i <= r)
z[i] = Math.min(r - i + 1, z[i - 1]);
while (i + z[i] < n && s.charAt(z[i]) == s.charAt(i + z[i]))
++z[i];
if (i + z[i] - 1 > r){
l = i;
r = i + z[i] - 1;
}
}
//checking for all the occurance of string t in string h
int res = 0;
for (int i = t.length() + 1; i < n;){
if (z[i] == t.length()){
//A copy is found so skip next t.length chars
i += t.length();
++res;
}
else ++i;
}
System.out.println("Number of Occurance : " + res);
return res;
}
この文字列のZ機能は、長さの配列である i番目要素が位置Iをから始まる文字 の最大数に等しいNそのsの最初の の文字と一致します。
これは、別の文字列Hの文字列トンの出現数を見つけるために利用することができます。新しい文字列sを形成するために、文字列tとhを中間のsentinel文字で結合したとします(Sentinel文字はどちらの文字列にもない文字です)。
z関数を配列z[]
で計算できるようにします。
ここで、センチネル文字の後の文字、つまり文字列hの文字から検索を開始できるようにします。文字列hのi番目の文字(i番目の文字が文字列sに属するような文字)の場合、z[i]
が文字列tの長さ(パターン)と等しい場合は、i番目の文字から始まり、t.length()
の文字は最初にt.length()
文字列sの文字列は、文字列tが等しいものです。
例:
T = AB
H = aaabaab
S = ABの$ aaabaab
Z = 0 0 0 1 1 2 0 1 2 0
I = 0 1 2 3 4 5 6 7 8 9
i = 5
私たちはz[i] == t.length()
を見ることができます。これはコピーが見つかりました。オーバーラッピングソリューションを避けるため、今度はt.length()
文字をスキップします。i = 7
これを続けると結果が得られます。
ようこそStackOverflow。 [help]にアクセスして[ask]を読むのに時間をかけてください。 あなたのコードを書くようにあなたに要求しているので、あなたの質問は話題になりません。 StackOverflowはディスカッション、チュートリアル、コード作成サイトではありません。これがうまくいくかどうかは、解決策を試し、問題に遭遇したときに助けを求めて、あなたが試したことと理解していないことを明確に説明することです。 –