1. 用c语言编写程序,找出用户输入的两个字符串中相同的子串,要求此输出的字符串中无重复的子串
//利用经典的大数据处理算法bloomfilter进行两个集合中相同元素的查找,去重
#include<stdio.h>
#include<string.h>
unsignedcharmask[8]={128,64,32,16,8,4,2,1};
//简单的哈希算法
inthashfuc(char*s,intkey)
{
inti,seed[4]={5,7,11,13},value=0;
if(key>=4)key%=4;
for(i=0;s[i];i++)
value+=s[i]*seed[key];
returnvalue;
}
//利用bloomfilter算法将字符串s映射到位数组m中,并去掉重复的子串
voidbloomfilter(unsignedchar*m,char*s)
{
inti,j,hvalue,brepeat;
charsubstr[32];
for(i=j=0;;i++){
if(s[i]!=''&&s[i]!=' '&&s[i]!=0)
substr[j++]=s[i];
else{
substr[j]=0;
brepeat=1;
for(j=0;j<4;j++){
hvalue=hashfuc(substr,j)&0X7F;
if((m[hvalue>>3]&mask[hvalue&7])==0){
m[hvalue>>3]|=mask[hvalue&7];
brepeat=0;
}
}
//如果是重复子串
if(brepeat==1){
j=strlen(substr);
strncpy(s+i-j,s+i+1,strlen(s)-i);
//printf("有重复子串%s,去重后是%s ",substr,s);
i=i-j-1;
}
if(s[i]==0)break;
j=0;
}
}
}
intmain()
{
chars1[256],s2[256],substr[32];
inti,j,hvalue;
unsignedcharm1[16]={0},m2[16]={0},m3[16];
printf("Firststring ");
gets(s1);
printf("Secondstring ");
gets(s2);
bloomfilter(m1,s1);
bloomfilter(m2,s2);
//求两个位数组的交集,子串能够映射到交集说明是相同的子串
for(i=0;i<16;i++){
m3[i]=m1[i]&m2[i];
//printf("%02x%02x%02x ",m1[i],m2[i],m3[i]);
}
printf(" 相同的子串有:");
j=0;
//只需要对一个字符串进行映射,只要能映射到交集的就是子串
for(i=0;;i++){
if(s1[i]!=''&&s1[i]!=' '&&s1[i]!=0)
substr[j++]=s1[i];
else{
substr[j]=0;
for(j=0;j<4;j++){
hvalue=hashfuc(substr,j)&0X7F;
if((m3[hvalue>>3]&mask[hvalue&7])==0)break;
}
if(j==4)printf("%s",substr);
if(s1[i]==0)break;
j=0;
}
}
printf(" ");
}
2. (C语言)输入3个字符串,将其中最小的输出。
eeeee
就是最小的啊
你是不是要输出最短的啊
如果是
就要用strlen()
而不是strcmp()
3. C语言 输入一个字符串 去掉重复的字符,输出无重复的
统计字符串中的重复字符,可以通过简单哈希算法来实现。
有效的字符的ascii值在0-127之间,定义一个128位的数组,初始化为0,用数组下标对应相应的字符,数组元素值表示字符出现的频率,统计相应字符的个数,个数大于1的字符就是重复的。
参考代码如下:
#include
void main()
{
char s[1024];
int carr[128]={0};
int i;
printf("input a string: ");
gets(s);
for( i=0;s[i];i++ )
{
int index=s[i];
if ( index >=0 && index <= 127 ) //安全处理,防止输入异常时,程序出错
carr[index]++ ;
}
for( i=0;i<128;i++ )
if ( carr[i] > 1 )
printf("%c:%d\n", i, carr[i] );
}运行结果:
input
a
string:
hello
world
l:3
o:2
4. c语言输出最大和最小的字符串
char str[200];
scanf("%s",str);
char min,max;
int minid,maxid;
int i=0;
min=max=str[0];
maxid=minid=0;
while(str[i]!='\0') {
if (str[i]>max) {
max=str[i];
}
if (str[i]<min) {
min=str[i];
minid=i;
}
i++;
}
i=0;
while(str[i]!='\0') {
if (str[i]==max) {
printf("最大元素是%c 位置%d\n",max,i);
}
if (str[i]==min) {
printf("最小元素是%c 位置%d\n",min,i);
}
i++;
}
大概逻辑就是这样 吧,希望对你有帮助。
5. c语言,输出最小的字符串。
for(i=1;i<5;i++){
scanf("%s",str);
if(min>str[i])
min==str;
}
这个循环写的有问题.每次循环输入一个字符串,然后如果一个字符窜大于一个字符???你写的循环是这个意思啊
6. C语言代码,输出以下三个字符串中的最小字符串。
#include<string.h>
#include<stdio.h>
intmain()
{
chart[3][20]={"google","","yahoo"};
if(strcmp(t[0],t[1])>0)strcpy(t[0],t[1]);
if(strcmp(t[0],t[2])>0)strcpy(t[0],t[2]);
puts(t[0]);
}
/*运行结果:
*/
7. C语言输出最小的字符串
复制字符串不能用=,必须用strcpy函数。
strcpy(s,str[i+1]);
8. 有C语言编程,输入一个字符串,求这个字符串中不重复的字母的个数(大小写区分)
#include<stdio.h>
#include<ctype.h>
int main(void)
{
char str[100]={'\0'};
int a[100]={0},i=0,n=0;
printf("请输入字符串:");
gets(str);
for(i=0;i<100;i++)
{
if(isalpha(str[i]))
a[str[i]-65]++;
}
for(i=0;i<100;i++)
{
if(a[i]==1)
n++;
}
printf("共有不重复的字母%d个\n",n);
return 0;
}
你看这个行不。。。
9. c语言问题 给定一个字符串(长度小于等于100),要求输出没有重复字符的最长的子串。
#include"stdio.h"
#include<stdlib.h>
#include"time.h"
intmain(intargc,char*argv[]){
chars[101],i,j,k,t,m[101];
srand((unsigned)time(NULL));
for(t=rand()%100+1,i=0;i<t;s[i++]=rand()%94+33);//产生随机字符串
s[i]='