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]='