Interviewstreet.com で文字列の類似性に関する質問を解決しようとしています。私のコードは 7/10 のケースで機能しています (そして、他の 3 つの時間制限を超えています)。
ここに私のコードがあります -
public class Solution {
public static void main(String[] args) {
Scanner user_input = new Scanner(System.in);
String v1 = user_input.next();
int number_cases = Integer.parseInt(v1);
String[] cases = new String[number_cases];
for(int i=0;i<number_cases;i++)
cases[i] = user_input.next();
for(int k=0;k<number_cases;k++){
int similarity = solve(cases[k]);
System.out.println(similarity);
}
}
static int solve(String sample){
int len=sample.length();
int sim=0;
for(int i=0;i<len;i++){
for(int j=i;j<len;j++){
if(sample.charAt(j-i)==sample.charAt(j))
sim++;
else
break;
}
}
return sim;
}
}
これが質問です-
2 つの文字列 A と B について、文字列の類似性を、両方の文字列に共通する最長のプレフィックスの長さと定義します。たとえば、文字列「abc」と「abd」の類似度は 2 ですが、文字列「aaa」と「aaaab」の類似度は 3 です。
文字列 S とその各サフィックスの類似度の合計を計算します。
入力:
最初の行にはテスト ケースの数 T が含まれます。次の T 行にはそれぞれ文字列が含まれます。
出力:
対応するテスト ケースの回答を含む T 行を出力します。
制約:
1 <= T <= 10
各文字列の長さは最大 100000 で、小文字のみが含まれます。
入力例:
2
ababaa
aa
サンプル出力:
11
3
説明:
最初のケースでは、ストリングのサフィックスは「ababaa」、「babaa」、「abaa」、「baa」、「aa」、および「a」です。これらの各文字列と文字列 "ababaa" との類似度は、それぞれ 6,0,3,0,1,1 です。したがって、答えは 6 + 0 + 3 + 0 + 1 + 1 = 11 です。
2 番目のケースの場合、答えは 2 + 1 = 3 です。
コードの実行速度を改善するにはどうすればよいですか。Web サイトは使用するテスト ケースのリストを提供しないため、さらに難しくなります。