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