MGJ14. 字符串的排列
描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母,例如ac输出描述
[ac, ca]示例1
输入:
acc
输出:
[acc, cac, cca]
C 解法, 执行用时: 2ms, 内存消耗: 360KB, 提交时间: 2020-05-20
#include<stdio.h> #include<string.h> char t[10]={0}; int cnt=0; void convert(char *strSource, char *strTarget, int nLen) { int i, j; char strConvert[10]; if(nLen == 1) { strTarget[0] = strSource[0]; if(cnt) printf(", %s", t); else printf("[%s", t); return; } else { for(i=0; i<nLen; i++) { for(j=0; j<i && strSource[i] != strSource[j]; j++); if(j == i) { strTarget[0] = strSource[i]; memcpy(strConvert, strSource, i); memcpy(strConvert+i, strSource+i+1, nLen-i-1); convert(strConvert, strTarget+1, nLen-1); cnt++; } } } } int main() { char s[10],temp[52]={0}; int n,i=0,j=0,k=0; scanf("%s",s); for(j=0;j<26;j++) { for(i=0;i<strlen(s);i++) { if((s[i]=='A'+j)) { temp[k++]=s[i]; } } } for(j=0;j<26;j++) { for(i=0;i<strlen(s);i++) { if((s[i]=='a'+j)) { temp[k++]=s[i]; } } } k=0; for(i=0;i<strlen(s);i++) { s[i]=temp[k++]; } convert(s, t, strlen(s)); printf("]"); return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 364KB, 提交时间: 2020-05-15
#include<stdio.h> #include<string.h> char t[10]={0}; int cnt=0; void convert(char *strSource, char *strTarget, int nLen) { int i, j; char strConvert[10]; if(nLen == 1) { strTarget[0] = strSource[0]; if(cnt) printf(", %s", t); else printf("[%s", t); return; } else { for(i=0; i<nLen; i++) { for(j=0; j<i && strSource[i] != strSource[j]; j++); if(j == i) { strTarget[0] = strSource[i]; memcpy(strConvert, strSource, i); memcpy(strConvert+i, strSource+i+1, nLen-i-1); convert(strConvert, strTarget+1, nLen-1); cnt++; } } } } int main() { char s[10],temp[52]={0}; int n,i=0,j=0,k=0; scanf("%s",s); for(j=0;j<26;j++) { for(i=0;i<strlen(s);i++) { if((s[i]=='A'+j)) { temp[k++]=s[i]; } } } for(j=0;j<26;j++) { for(i=0;i<strlen(s);i++) { if((s[i]=='a'+j)) { temp[k++]=s[i]; } } } k=0; for(i=0;i<strlen(s);i++) { s[i]=temp[k++]; } convert(s, t, strlen(s)); printf("]"); return 0; }