| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2111 人关注过本帖
标题:一串字母可以拼出的最大单词长度,求帮看看这个程序哪里有问题?
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:4 
这题题意不明,不知道具体那个字符串是以什么样的方式匹配的(或者是语文没有学好),示例那就只有一个数但不解释却没有说明某些存在歧义的理解情况,例如arry 和ra这个算0个还是算两个?如果是按顺序那就0个,但只是包含字母组成那就两个~还有arry和r匹配算1个还是两个?这些歧义题目没有解释清楚,所以不好作答~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-07 21:16
青蝶
Rank: 2
等 级:论坛游民
帖 子:160
专家分:51
注 册:2018-2-4
收藏
得分:0 
回复 11楼 九转星河
有人补充解释了一下:
那一列字母可以换顺序,abc和acb是一样的。
但是字母不能重复用,arry和r配的话返回1。
2018-05-07 21:28
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:6 
题主思路基本正确,就是设置两个字母桶,对字母进行计数,判断单词字母数是否大于参考字母数即可。
下述代码基本是按照题主思路编写的,只不过考虑了字母大小写,试试能否通过:
程序代码:
#include<stdio.h>
void main()
{
    int i,j,k,n,max;
    char a[26],b[26],c[10],d[21];
    while(scanf("%s",d)!=EOF)
    {
        for(i=0;i<26;i++)a[i]=0;
        for(i=0;d[i];i++)a[d[i]>='a'?d[i]-'a':d[i]-'A']++;
        scanf("%d",&n);
        for(max=0;n;n--)
        {
            scanf("%s",c);
            for(i=0;i<26;i++)b[i]=0;
            for(i=j=0;c[i];i++)
            {
                k=c[i]>='a'?c[i]-'a':c[i]-'A';
                b[k]++;
                if(b[k]>a[k])break;
                j++;
            }
            if(!c[i]&&j>max)max=j;
        }
        printf("%d\n",max);
    }
}
2018-05-07 22:52
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
看明白大概了,大意就是说要判断子串的组成(包含字母具体个数)是否是主串的子集,如果是子集,那就找长度最长那个~
用桶算法基本上可以说是最优了~

我初初还以为读取子串时只能按主串的递增顺序(题目例子就是这样的),当然递增同样可以做出来,有兴趣的可以试试做个规定主串只能按递增顺序来看看(这个就好玩了,和我最近弄那个字符串排序优化思想有点类似)~



[此贴子已经被作者于2018-5-8 01:06编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-08 00:59
青蝶
Rank: 2
等 级:论坛游民
帖 子:160
专家分:51
注 册:2018-2-4
收藏
得分:0 
回复 13楼 xzlxzlxzl
谢谢~我稍微改了一下大佬的代码,在Dev c++上能成功运行,不知道为什么在oj上运行错误?
#include<stdio.h>
#include<string.h>
int main(void){
  int i,j,k,n,max;
  int letters[26]={0},word[26]={0};
  char c[11]={0},d[21]={0};
  while(scanf("%s",d)!=EOF){
      for(i=0;d[i];i++) letters[d[i]-'a']++;
      scanf("%d",&n);
      for(max=0;n;n--){
          scanf("%s",c);
          memset(word,0,26*sizeof(int));
          for(i=0,j=0;c[i];i++){
              word[c[i]-'a']++;
              if(word[c[i]-'a']>letters[c[i]-'a']) break;
              j++;
          }
          if(!c[i]&&j>max) max=j;
      }
      printf("%d\n",max);
  }
   return 0;
}
         
2018-05-08 10:11
快速回复:一串字母可以拼出的最大单词长度,求帮看看这个程序哪里有问题?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015694 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved