《编程思维与实践》1050.最大分词法

《编程思维与实践》1050.最大分词法

题目

在这里插入图片描述

在这里插入图片描述

思路

具体步骤按题目所给的算法进行即可:

1.存词典和最长词长;

2.依次检索字符串s[0,L-1]…s[0,1] (依次令s[L],s[L-1]…s[1]为’\0’) 是否在词典中(遍历用strcmp判断);

3.切割字符串: 可以在检索字符串后返回检索长度,利用strcpy来实现.

注意的点:

1.在切割字符串对s的内容进行自覆盖时最好先用一个变量去存储,避免出现问题;

2.当s的长度小于最长词长时应该检索应该从s[0,len-1]开始而不是s[0,L-1].

代码

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

char temp[5001];   //分割字符串长度不超过5000

int search(char *s,int len,char (*tab)[15],int n)
{
	strcpy(temp,s);  //拷贝
	while(len>0)  //依次检查s[0,L-1]...s[0,1]
	{
		temp[len--]='\0';  //依次令s[L],s[L-1]...s[1]为'\0'
		for(int i=0;i<n;i++)
		{
			if(strcmp(temp,tab[i])==0) //在词典中
			{
				printf("%s ",temp);
				return len+1; 	//返回长度用于切割
			}
		}
	}
	printf("%c ",temp[0]); 	 //len=0,直接分割该字符
	return 1;
}

void cut(char *s,int cut_len)   //将字符串分割出来
{
    strcpy(temp,s+cut_len);  //自覆盖时最好用一个temp先存着
	strcpy(s,temp);
}

int main()
{
	int n;
	scanf("%d",&n);
	char tab[n][15];   //词典 单词长度不超过14
	int len_max=0;  //词典中最长单词长度
	for(int i=0;i<n;i++)
	{
		scanf("%s",tab[i]);
		if(strlen(tab[i])>len_max)
		{
			len_max=strlen(tab[i]);
		}
	}
	char s[5001];
	scanf("%s",s);
	while(s[0]!='\0')
	{
		if(strlen(s)>len_max)    
		{
			int cut_len=search(s,len_max,tab,n);
			cut(s,cut_len);
		}
		else   
        {
			int cut_len=search(s,strlen(s),tab,n);
			cut(s,cut_len);
		}
	}	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值