1

O(n ^ 2)未満で、3番目の配列を使用せず に、2つの文字列が循環しているかどうかを確認する方法。
入力
str1 = "abcde" str="eabcd"
出力
サイクリック
入力
str1 = "cabdc" str="ccabd"
出力
サイクリック
入力
str1 = "ddabnhdd" str="dddabnhd"
出力
サイクリック

考えられる最善の解決策を教えてください???

4

2 に答える 2

4

最適化された文字列検索を行う必要がありO(n) + O(m)ます。 その後、最初の文字列を 2 倍にして 2 番目の文字列を検索すると、時間がかかります。 3 番目の配列の使用を避けるには、最初の文字列へのすべてのアクセスをモジュロ n にします。
O(n)

于 2012-08-04T15:44:17.327 に答える
3

答えは次のとおりです。

このアルゴリズムは O(n) 時間かかり、追加の配列はまったくなく、単語の最小の循環シフトを見つけます。

それを使用して、簡単に確認できます。

int a=minLexCyc(str1),b=minLexCyc(str2),i,n=strlen(str1);
for(i=0;i<n;i++){
        if(str1[(a+i)%n]!=str2[(b+i)%n]){
                cout<< "not cyclic";
                return ;
        }
}
cout<< "cyclic";

PS:検索文字列部分を含むソリューションは、 O(n)3番目の配列を使用せずに要件を満たすとは思いません。したがって、おそらく最小サイクリック シフト ソリューションが唯一のソリューションです。

于 2012-08-04T19:21:28.133 に答える