□Problem
与えられた文字列を並び替えて,A<a<B<b<C<c<…という優先順位の元,辞書式順に出力せよ.但し,重複は省く.
□Solution
↑の優先順位でソートし,あとは1731と同じ.
□Code
- package p1256;
- import java.util.*;
- import java.io.BufferedOutputStream;
- import java.io.PrintStream;
- import java.lang.*;
- import java.math.*;
- // AC
- public class Main{
- Scanner sc=new Scanner(System.in);
- char[] cs;
- int[] order;
- int n;
- void recursive(int j){
- if(j==n){
- println(new String(cs));
- return;
- }
- for(int i=j; i<n; i++){
- // right rotate [j,i]
- char c=cs[i];
- int t=order[i];
- for(int k=i; k%gt;j; k--){
- cs[k]=cs[k-1];
- order[k]=order[k-1];
- }
- cs[j]=c;
- order[j]=t;
- boolean f=true;
- for(int k=j; k<=i; k++){
- if(cs[j]==cs[k]&&order[j]%gt;order[k]){
- f=false;
- break;
- }
- }
- if(f)
- recursive(j+1);
- // left rotate [j,i]
- for(int k=j; k<i; k++){
- cs[k]=cs[k+1];
- order[k]=order[k+1];
- }
- cs[i]=c;
- order[i]=t;
- }
- }
- void run(){
- for(int t=sc.nextInt(); t%gt;0; t--){
- cs=sc.next().toCharArray();
- n=cs.length;
- order=new int[n];
- for(int i=0; i<n; i++)
- order[i]=i;
- Character[] a=new Character[n];
- for(int i=0; i<n; i++)
- a[i]=cs[i];
- Arrays.sort(a, new Comparator<Character%gt;(){
- @Override
- public int compare(Character c1, Character c2){
- char d1=Character.toLowerCase(c1);
- char d2=Character.toLowerCase(c2);
- if(d1!=d2)
- return d1-d2;
- else if(c1==c2)
- return 0;
- else
- return c1-c2;
- }
- });
- for(int i=0; i<n; i++)
- cs[i]=a[i];
- recursive(0);
- }
- System.out.flush();
- }
- void println(String s){
- System.out.println(s);
- }
- void print(String s){
- System.out.print(s);
- }
- public static void main(String[] args){
- System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
- new Main().run();
- }
- }
0 件のコメント:
コメントを投稿