2017-01-16 11 views
0

メッセージの暗号を解除するには、まずその鍵を見つける必要があります。与えられた情報から、私はキーが文字列の一部です見つける:文字列中で最も長い連続した部分文字列を見つける方法は?

STR =「251220825122082」

私たちは、簡単にキーをすることになっているので、キーが「2512208」であることを得ることができますメッセージの暗号化に繰り返し使用される。しかし、私は多くの方法を試して、 "25122082"という答えを得ました。これは最後にもう2つ追加されますが、それは鍵のもう一つの始まりです。

私が試してみまし方法:

  1. 正規表現:String repeated = str.replaceAll("(.+?)\\1+", "$1");
  2. LRS Javaこれら2

が同じ答えを提供( "25122082")。

誰でもこの問題を解決できますか?

ありがとうございました!

+0

の可能性のある重複:http://stackoverflow.com/questions/10355103/finding-the-longest-repeated-substringは –

+1

'replaceAll'は、行うことになっているものを正確にやっていますそれは25122082512208を2512208に置き換えます。文字列の最後にはまだ2が残りますが、置き換えられません。ここでは、文字列から情報を抽出しようとしているので、 'replaceAll'は間違ったツールです。正規表現を検索するには 'find'を使用し、キャプチャグループを抽出するには' group'を使います。 'replaceAll'は、入力文字列の一部を他の文字列に置き換え、入力文字列の残りの部分だけを残すためのものです。それはあなたがここでやろうとしていることではありません。 – ajb

+0

2512208がキーであり、25122082ではないことをどのように知っていますか? –

答えて

1

@ajbのおかげで、find()とgroup()を使ってこの問題を解決しました。

String str = "251220825122082"; 
    Pattern p = Pattern.compile("(.+?)\\1+"); 
    Matcher m = p.matcher(str); 
    while (m.find()) { 
     String repeated = m.group(1); 
     System.out.println(repeated); 
    } 

出力:2512208

+0

私が言ったことは、最初のグループの内容を得るために 'm.group(1)'と言うことができたということです(正規表現では '\\ 1 '、置換文字列では' $ 1'と同じです)。 'm.group()'は一致した文字列全体を返しますが、 'm.group(1)'は必要なキーを正確に返します。それ以降、別の 'replaceAll'は必要ありません。 – ajb

+0

ありがとうございます!しかし、キーが「5122082」の場合はどうすれば見つけることができますか? –

+0

入力文字列が上記の 'str'で、"最長の連続する部分文字列 "がキーの場合、あいまいです。 2512208と5122082の両方が基準を満たしており、どちらも同じです。 5122082がキーであることを明確にするルールがある場合(例えば、ネクタイの場合にファイルの_last_部分文字列が選択されるなど)、ルールに従うようにコードを調整する方法があるかもしれません。ルールがない場合、解決策はありません.2つの間で決める方法はありません。 – ajb

関連する問題