【九度】题目1120:全排列 && 题目1369:字符串的排列

1、题目1120:全排列
题目描述:
        给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。
        我们假设对于小写字母有'a' < 'b' < ... < 'y' < 'z',而且给定的字符串中的字母已经按照从小到大的顺序排列。
输入:
        输入只有一行,是一个由不同的小写字母组成的字符串,已知字符串的长度在1到6之间。
输出:
        输出这个字符串的所有排列方式,每行一个排列。要求字母序比较小的排列在前面。字母序如下定义:
        已知S = s1s2...sk , T = t1t2...tk,则S < T 等价于,存在p (1 <= p <= k),使得
        s1 = t1, s2 = t2, ..., sp - 1 = tp - 1, sp < tp成立。
样例输入:
        abc
样例输出:
        abc
        acb
        bac
        bca
        cab
        cba
提示:
         每组样例输出结束后要再输出一个回车。
来源:
         2008年北京大学图形实验室计算机研究生机试真题
答疑:
        解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-7843-1-1.html

2、题目1369:字符串的排列
题目描述:
        输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入:
        每个测试案例包括1行。
        输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
输出:
         对应每组数据,按字典序输出所有排列。
样例输入:
        abc
        BCA
样例输出:
        abc
        acb
        bac
        bca
        cab
        cba
        ABC
        ACB
        BAC
        BCA
        CAB
        CBA
答疑:
        解题遇到问题?分享解题心得?讨论本题请访问:http://t.jobdu.com/thread-8092-1-1.html
        这两道题和LeetCode/Permutations && Permutations II分析思路一致,可以选用的方法也一致。
        针对1120和1369给出nextPermutation的Java和C++代码。
        其中1369Java的nextPermutation和DFS都没过。给出C++AC代码
1120 Java AC

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
 
public class Main{
 
    private static List<String> arrList;
      
    public static void main(String[] args) throws Exception {
        StreamTokenizer st = new StreamTokenizer
					(new BufferedReader(new InputStreamReader(System.in)));
        while (st.nextToken() != StreamTokenizer.TT_EOF) {
            arrList = new ArrayList<String>();
            String a = st.sval;
            char array[] = a.toCharArray();
            Arrays.sort(array);
            permutation(array);
            Collections.sort(arrList);
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < arrList.size(); i++) {
                sb.append(arrList.get(i) + "\n");
            }
            System.out.println(sb);
        }
    }
 
    private static void permutation(char[] array) {
        // TODO Auto-generated method stub
        int len = array.length;
        while (true) {
            arrList.add(String.valueOf(array));
            int first = getFirst(array, len);
            if (first == -1) {
                return;
            }
            int i = len-1;
            for (; i > first; i--) {
                if (array[i] > array[first]) {
                    break;
                }
            }
            swap(array,first, i);
            reverse(array,first+1,len-1);
        }
    }
 
    private static int getFirst(char[] array, int len) {
        for (int i = len-2; i >= 0; i--) {
            if (array[i] < array[i+1]) {
                return i;
            }
        }
        return -1;
    }
    private static void swap(char[] array ,int a, int b) {
        char temp = array[b];
        array[b] = array[a];
        array[a] = temp;
    }
      
    private static void reverse(char[] array ,int a, int b) {
        while (a < b) {
            swap(array, a, b);
            a++;
            b--;
        }
    }
}
/**************************************************************
    Problem: 1120
    User: wangzhenqing
    Language: Java
    Result: Accepted
    Time:1700 ms
    Memory:178508 kb
****************************************************************/
C++ AC

#include <stdio.h>
#include <string>
using namespace std;
string array;
int len;
 
void swap(int a, int b) {
    char temp = array[b];
    array[b] = array[a];
    array[a] = temp;
}
 
void reverse(int a, int b) {
    while (a < b) {
        swap(a, b);
        a++;
        b--;
    }
}
void permutation() {
     
    int i,j;
    while (true) {
        printf("%s\n",array.c_str());
        for (i = len - 2; i >= 0; i--) {
            if (array[i] < array[i+1]) {
                break;
            }
            if (i == 0) {
                return;
            }
        }
        for (j = len - 1; j > i ; j--) {
            if (array[j] > array[i]) {
                break;
            }
        }
             
        swap(i,j);
        reverse(i+1,len-1);
    }
}
     
     
int main(){ 
 
    char data[10];
    while(scanf("%s",&data) != EOF ){
        array = data;
        len = array.size();
        if (len == 1) {
            printf("%s\n",array.c_str());
            printf("\n");
            continue;
        }
        permutation();
        printf("\n");
    }
   
    return 0;
}
/**************************************************************
    Problem: 1120
    User: wzqwsrf
    Language: C++
    Result: Accepted
    Time:370 ms
    Memory:1052 kb
****************************************************************/

1369 C++ AC

#include <stdio.h>
#include <string.h>
#include <string>
#include <algorithm>
using namespace std;
string array;
int len;
 
void swap(int a, int b) {
    char temp = array[b];
    array[b] = array[a];
    array[a] = temp;
}
 
void reverse(int a, int b) {
    while (a < b) {
        swap(a, b);
        a++;
        b--;
    }
}
void permutation() {
     
    int i,j;
    while (true) {
        printf("%s\n",array.c_str());
        for (i = len - 2; i >= 0; i--) {
            if (array[i] < array[i+1]) {
                break;
            }
            if (i == 0) {
                return;
            }
        }
        for (j = len - 1; j > i ; j--) {
            if (array[j] > array[i]) {
                break;
            }
        }
             
        swap(i,j);
        reverse(i+1,len-1);
    }
}     
int main(){ 
 
    char data[11];
    while(scanf("%s",&data) != EOF ){
        len = strlen(data);
        sort(data, data + len);
        array = data;
        if (len == 1) {
            printf("%s\n",array.c_str());
            continue;
        }
        permutation();
    }
   
    return 0;
}
/**************************************************************
    Problem: 1369
    User: wzqwsrf
    Language: C++
    Result: Accepted
    Time:120 ms
    Memory:1052 kb
****************************************************************/

你可能感兴趣的:(【九度】题目1120:全排列 && 题目1369:字符串的排列)