取子串,要求子串不重复。
时间: 1ms 内存:128M
描述:
输入字母构成的字符串(不大于30字符)从中读取3个不重复的字符,求所有取法,取出的字符串按升序排列。不同取法输出顺序可以不考虑。
输入:
输入一串字符(不超过30个)
输出:
从中读取3个不重复的字符,求所有取法,取出的字符串按升序排列。
示例输入:
abcd
示例输出:
abc
abd
acd
bcd
提示:
参考答案(内存最优[1092]):
#include<stdio.h>
#include<string.h>
int l;
void dfss(char str[],char ch[],int x,int k)
{
int i,j;
if (k==2) {
for (i=0;i<=2;i++)
printf("%c",ch[i]);
printf("\n");
return ;
}
for (i=x+1;i<=l;i++)
if (ch[k]<str[i])
{
ch[k+1]=str[i];
dfss(str,ch,i,k+1);
}
return ;
}
int main ()
{
int x,y,i,j;
char str[1000],ch[3];
gets(str);
l=strlen(str);
for (i=0;i<=l-3;i++)
{
ch[0]=str[i];
dfss(str,ch,i,0);
}
return 0;
}
参考答案(时间最优[0]):
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
void getdf(char arr1[],char arr2[])
{
int len1=strlen(arr1),len2=0;
for(int i=0;i<len1;i++)
{
int flag=0;
if(len2==0)
{
arr2[0]=arr1[0];
len2++;
continue;
}
else
{
for(int j=0;j<len2;j++)
{
if(arr1[i]!=arr2[j])
{
flag=0;
continue;
}
else
{
flag=1;
break;
}
}
}
if(flag==0)
{
arr2[len2++]=arr1[i];
}
}
arr2[len2]='\0';
}
bool cmp(char a,char b)
{
return a<b;
}
int main()
{
char arr1[30],arr2[30];
cin>>arr1;
getdf(arr1,arr2);
int leng=strlen(arr2);
sort(arr2,arr2+leng,cmp);
for(int i=0;i<leng-2;i++)
for(int j=i+1;j<leng-1;j++)
for(int k=j+1;k<leng;k++)
{
cout<<arr2[i]<<arr2[j]<<arr2[k]<<endl;
}
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。