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 ****************************************************************/