入力仕様文字列の文字によって形成された回文の数を数える方法は?
プログラムは テストする文字列を示す文字列Sです。英数字入力のすべての文字は入力から作成することができるユニークな回文数の合計をプリントアウトし、(500≤1≤LENGTH(S))の入力に基づいて
出力仕様
を小文字にします。 は具体的に、我々は、入力文字列「bbaa」を持っているし、我々は回文「BAAB」、「アバ」ので、入力文字列「bbaa」により作成された回文数の合計を持っていると仮定すると、2次さは、しかし、私が書いたコードです時間制限を超え、アルゴリズムが効率的ではありません。誰かが効率を改善できるようにアルゴリズムを構築する方法がありますか?回文を数えるはるかに簡単な方法はあり
import java.util.*;
import java.lang.*;
public class Problem
{
private static int count=0;
public static void main(String[] args)
{
Scanner stdin = new Scanner(System.in);
//int count=0;
while(stdin.hasNextLine())
{ String line=stdin.nextLine();
char[] line_char=line.toCharArray();
Arrays.sort(line_char);
StringBuilder strbuild=new StringBuilder("");
solve(line_char,new boolean[line_char.length],strbuild);
//System.out.println(stdin.nextLine());
}
System.out.println(count);
stdin.close();
}
public static void solve(char[] chararray,boolean[] used,StringBuilder strbuild){
if(strbuild.length()==chararray.length){
//System.out.println(strbuild.toString());
if(checkpalindrome(strbuild)){
count++;
}
}else{
char rec=(char)(chararray[chararray.length-1]+1);
for(int i=0;i<chararray.length;i++){
if(!used[i]&&rec!=chararray[i]){
rec=chararray[i];
strbuild.append(chararray[i]);
used[i]=true;
solve(chararray,used,strbuild);
strbuild.deleteCharAt(strbuild.length()-1);
used[i]=false;
}
}
}
}
public static boolean checkpalindrome(StringBuilder strbuild){
String str=strbuild.toString();
StringBuilder str1=new StringBuilder(strbuild);
return str.equals(str1.reverse().toString());
}
}
我々は唯一の入力文字列があると!だから私はSystem.out.println(count)を置くのです。最後に! – user144600
@ GurwinderSingh - OPが入力文字を並べ替えることができるので、実際は重複しません。リンクした質問は、回文であるすべての部分文字列を見つけることです。 –
回文はすべての入力文字を使用する必要がありますか?そうでなければ、あなたのサンプル入力では、 "a"、 "b"、 "aa"、 "bb"(回文と見なされても空文字列はありません)という回文もあるからです。しかしそれは頼む価値がある。 –