• 输出全排列缺少的字符串


    时间间限制: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]);
        }
    }
    

      

  • 相关阅读:
    qq链接
    HTML5获取地理坐标
    AJAX的同步和异步的区别
    取消版本控制
    格式化打印数组函数
    图片返回刷新
    从哪些方面优化网站
    朋友圈的基本数据结构设计是怎样的?既能做到完美阅读权限设置,又能兼顾性能?
    表单提交数据安全性验证
    自然世界的划分
  • 原文地址:https://www.cnblogs.com/hgc-bky/p/9588462.html
Copyright © 2020-2023  润新知