解は O(n) 時間で、スペースは O(1) である必要があります。これはソートを省略し、スペース O(1) の要件は、おそらく文字列のハッシュを作成してそれらを比較する必要があるというヒントです。
素数リストにアクセスできる場合は、cheeken のソリューションに従ってください。
注: 素数リストにアクセスできないと面接官が言った場合。次に、素数を生成して保存します。アルファベットの長さが定数であるため、これは O(1) です。
それ以外の場合は、私の別のアイデアです。簡単にするために、アルファベットを = {a,b,c,d,e} と定義します。文字の値は次のように定義されます。
a, b, c, d, e
1, 2, 4, 8, 16
注: インタビュアーがこれは許可されていないと言った場合は、アルファベットのルックアップ テーブルを作成します。アルファベットのサイズは一定であるため、これには O(1) スペースが必要です。
文字列内の個別の文字を見つけることができる関数を定義します。
// set bit value of char c in variable i and return result
distinct(char c, int i) : int
E.g. distinct('a', 0) returns 1
E.g. distinct('a', 1) returns 1
E.g. distinct('b', 1) returns 3
したがって、文字列「aab」を反復すると、distinct 関数は結果として 3 を返すはずです
文字列内の文字の合計を計算できる関数を定義します。
// return sum of c and i
sum(char c, int i) : int
E.g. sum('a', 0) returns 1
E.g. sum('a', 1) returns 2
E.g. sum('b', 2) returns 4
したがって、文字列「aab」を反復すると、sum 関数は結果として 4 を与えるはずです。
文字列の文字の長さを計算できる関数を定義します。
// return length of string s
length(string s) : int
E.g. length("aab") returns 3
2 つの文字列に対してメソッドを実行し、結果を比較すると、O(n) の実行時間がかかります。ハッシュ値を格納するには、O(1) のスペースが必要です。
e.g.
distinct of "aab" => 3
distinct of "aba" => 3
sum of "aab => 4
sum of "aba => 4
length of "aab => 3
length of "aba => 3
両方の文字列のすべての値が等しいため、それらは互いの順列である必要があります。
編集:コメントで指摘されているように、特定のアルファベット値では解決策が正しくありません。