输出全排列缺少的字符串

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

  

原文地址:https://www.cnblogs.com/hgc-bky/p/9588462.html

时间: 2025-01-16 22:54:27

输出全排列缺少的字符串的相关文章

684. 缺少的字符串

684. 缺少的字符串 中文English 给出两个字符串,你需要找到缺少的字符串 样例 样例 1: 输入 : str1 = "This is an example", str2 = "is example" 输出 : ["This", "an"] 注意事项 输出时字符串顺序为输入字符串内的顺序 class Solution: """ @param str1: a given string @pa

JavaScript面试题:重复输出一个给定的字符串

面试题 重复输出一个给定的字符串(str第一个参数)n 次 (num第二个参数),如果第二个参数num不是正数的时候,返回空字符串. function repeatStringNumTimes(str, num) { return str; } repeatStringNumTimes("abc", 3); 提供测试情况: repeatStringNumTimes("*", 3) //应该返回 "***". repeatStringNumTime

字符串分隔 -&gt;连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; ?长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

?连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组:?长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入描述: 连续输入字符串(输入2次,每个字符串长度小于100) 输出描述: 输出到长度为8的新字符串数组 输入例子: abc 123456789 输出例子: abc00000 12345678 90000000 import java.util.*; public class Main{     public static void main(String[] ar

使用printf输出各种格式的字符串( 转载)

1. 原样输出字符串:    printf("%s", str);2. 输出指定长度的字符串, 超长时不截断, 不足时右对齐:    printf("%Ns", str);             --N 为指定长度的10进制数值3. 输出指定长度的字符串, 超长时不截断, 不足时左对齐:    printf("%-Ns", str);            --N 为指定长度的10进制数值4. 输出指定长度的字符串, 超长时截断, 不足时右对齐

一道有趣的算法题:仿照Excel的列编号,给定一个数字,输出该列编号字符串

       By Long Luo 最近遇到一个算法题: 仿照Excel的列编号,给出一个数字,输出该列编号字符串. 例如:A对应1,Z对应26,AA对应27,AZ对应52 ...... 这个题目是一个典型的26进制思路去处理,但是这个题目里面有很多陷阱,在1, 26, 52等特殊情况进行考虑,经过晚上接近1个小时的编写,完成的代码如下: C++代码如下: #include <iostream> #include <string.h> using namespace std; /

按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”

1 import java.util.ArrayList; 2 import java.util.Scanner; 3 4 public class Text { 5 6 @SuppressWarnings("resource") 7 public static void main(String[] args) { 8 Scanner scanner = new Scanner(System.in); 9 int M = scanner.nextInt();//M代表输入的M串字符串

【转】重复输出一个给定的字符串的几种方法

方法1:通过 `while` 循环重复输出一个字符串 解题思路:while 语句只要指定的条件计算结果为true的时候,就执行其语句.while 语句的语法是这样的: 1 while (expression) 2 statement 在每次通过循环之前计算条件结果.如果条件为true,则执行语句.如果条件为false,则执行继续 while 循环之后的任何语句. 只要条件为true,语句就会执行. 这里是解决方案: function repeatString(str, times) { //空字

[PTA]7-1 找最小的字符串 针对输入的N个字符串,输出其中最小的字符串(c++)

7-1 找最小的字符串 本题要求编写程序,针对输入的N个字符串,输出其中最小的字符串. 输入格式: 输入第一行给出正整数N:随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符. 输出格式: 在一行中用以下格式输出最小的字符串: Min is: 最小字符串 输入样例: 5 Li Wang Zha Jin Xian 输出样例: Min is: Jin 解答: 1 #include <iostream> 2 #include<string> 3 using

IE(兼容问题)错误:缺少标识符 字符串或数字的解决

在IE上遇到一个问题,缺少标识符 字符串或数字的解决. 问题是我的html页面在Firefox.chorme中运行正常,而在IE中老是报“缺少标识符 字符串或数字”的错误,原因: 这就是IE和Firefox不兼容的地方.属性之间是要用","分隔的,但最后一个属性的后面在IE中是不能有的,firefox可有可无. 至于最后的";"是另外一回事了.这是Javascript的语法问题.如果后面没有其它js语句时";"可以省略.