时间间限制:1000ms
题目描述:对K个不同字符的全排列组成的数组, 面试官从中随机拿走了一个, 剩下的数组作为输入, 请帮忙找出这个被拿走的字符串?
比如[“ABC”, “ACB”, “BAC”, “CAB”, “CBA”] 返回 “BCA”
输入描述:第一行输入整数n,表示给定n个字符串。(n == x!-1,2<=x<=10)
以下n行每行输入一个字符串。
输出描述:输出全排列缺少的字符串。
示例1
输入5
ABC
ACB
BAC
CAB
CBA
输出BCA
package com.cslg.day01; import java.util.Collections; import java.util.LinkedList; import java.util.Scanner; public class main02 { public static LinkedList<String> list2 = new LinkedList<String>(); public static void allPermutation(String str){ if(str == null || str.length() == 0) return; //保存所有的全排列 LinkedList<String> listStr = new LinkedList<String>(); allPermutation(str.toCharArray(), listStr, 0); print(listStr);//打印全排列 } private static void allPermutation(char[] c, LinkedList<String> listStr, int start){ if(start == c.length-1) listStr.add(String.valueOf(c));//System.out.println(String.valueOf(c)); else{ for(int i = start; i <= c.length-1; i++) { //只有当没有重叠的字符 才交换 if(!isSwap(c, start, i)) { swap(c, i, start);//相当于: 固定第 i 个字符 allPermutation(c, listStr, start+1);//求出这种情形下的所有排列 swap(c, start, i);//复位 } } } } private static void swap(char[] c, int i, int j){ char tmp; tmp = c[i]; c[i] = c[j]; c[j] = tmp; } private static void print(LinkedList<String> listStr) { Collections.sort(listStr);//使字符串按照'字典顺序'输出 for(int i=0;i<listStr.size();i++){ if(!list2.contains(listStr.get(i))){ System.out.println(listStr.get(i)); } } } //[start,end) 中是否有与 c[end] 相同的字符 private static boolean isSwap(char[] c, int start, int end) { for(int i = start; i < end; i++) { if(c[i] == c[end]) return true; } return false; } public static void main(String[] args) { Scanner in = new Scanner(System.in); int num = in.nextInt(); String[] str = new String[num]; for(int i=0;i<num;i++){ str[i] = in.next(); list2.add(str[i]); } allPermutation(str[0]); } }