算法很美之字符串

第五篇 算法很美之字符串

题目1 : 然而沼跃鱼早就看穿了一切

描述

fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽所有句子中的沼跃鱼(“marshtomp”,不区分大小写)。为了使句子不缺少成分,统一换成 “fjxmlhx” 。
输入

输入包括多行。

每行是一个字符串,长度不超过200。

一行的末尾与下一行的开头没有关系。
输出

输出包含多行,为输入按照描述中变换的结果。
样例输入

The Marshtomp has seen it all before.
marshTomp is beaten by fjxmlhx!
AmarshtompB

样例输出

The fjxmlhx has seen it all before.
fjxmlhx is beaten by fjxmlhx!
AfjxmlhxB

思路:检测连续的9个字母是否为marshtomp,如果是则输出fjxmlhxB,如果不是则输出原字符

本人AC代码

#include<stdio.h>
#include<string.h>
main()
{
	char s[201];
	char a1[10]="marshtomp";
	char a2[10]="MARSHTOMP";
	int i,j;
	while(gets(s))
	{
		for(i=0;i<strlen(s);i++)//挨个检查
		{
			if(s[i]==a1[0]||s[i]==a2[0])//如果第一个字母是
			{							//	则进一步检查
				for(j=1;j<9;)
				{
					if(s[i+j]==a1[j]||s[i+j]==a2[j])
						j++;
					else
					{
						printf("%c",s[i]);
						break;
					}	
					if(j==9)
					{
						printf("fjxmlhx");
						i+=8;
						break;
					}
						
				}
			}
			else printf("%c",s[i]);//否则原样输出
		}
		printf("\n");	 
	} 
	return 0;
}

题目2 : hiho字符串

描述

如果一个字符串恰好包含2个’h’、1个’i’和1个’o’,我们就称这个字符串是hiho字符串。

例如"oihateher"、"hugeinputhugeoutput"都是hiho字符串。

现在给定一个只包含小写字母的字符串S,小Hi想知道S的所有子串中,最短的hiho字符串是哪个。
输入

字符串S

对于80%的数据,S的长度不超过1000

对于100%的数据,S的长度不超过100000
输出

找到S的所有子串中,最短的hiho字符串是哪个,输出该子串的长度。如果S的子串中没有hiho字符串,输出-1。
样例输入

happyhahaiohell

样例输出

5

思路:尺取法

本人AC代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int min(int a,int b)
{
	return a<b?a:b;
}
 
int f[100]={0};
int main()
{
    char s[100005];
    scanf("%s",s);
    int len=strlen(s);
    int j=0, temp=0,i;
    int l=100005;
    for(i=0; i<len; i++)
    {
        f[s[i]-'a']++;
        temp=0;
        while(f['h'-'a']>=2 && f['i'-'a']>=1 && f['o'-'a']>=1)
        {				//当h,i,o的个数分别大于2,1,1时所遍历
            f[s[j]-'a']--; //的字符串中可能存在目标字符串,此时更新
            j++;             //更新左端点;
            temp=1;
        }
        if(temp)
        {    //temp==1说明进入了上一个循环,因为跳出循环的条件是
            j--;  //f['h'-'a']<2 || f['i'-'a']<1 || f['o'-'a']<1;所以将最后s[j]的个数加一;
            f[s[j]-'a']++;
        }
        if(f['h'-'a']==2 && f['i'-'a']==1 && f['o'-'a']==1)
        {//满足条件就更新一下l;
            l=min(l, i-j+1);
        }
    }
    if(l==100005) printf("-1\n");
    else printf("%d\n",l);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值