取子串,要求子串不重复。

取子串,要求子串不重复。

时间: 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;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注