《编程思维与实践》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;
}