| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1208 人关注过本帖, 1 人收藏
标题:关于一道字符串排序问题
只看楼主 加入收藏
H_K
Rank: 1
等 级:新手上路
帖 子:13
专家分:3
注 册:2010-11-30
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:12 
关于一道字符串排序问题
各位大大好,我在某网站上看到一道字符串排序的题目,就是有一长一短两个字符串,求判断一个短字符串的全部字符是否在包含在一个长字符串内,例如
“ABC”包含在“ABCDEF”内,而“ABKL”没有包含在内,我看到一个思路比较有意思,就是定义一个26长度的字符数组,先遍历短字符串,如果有‘A’,那么数组的第一个元素为‘F’,如果有‘B’,则第二个元素为‘F’,以此类推,一一对应,数组其他的元素不做操作,然后再遍历长字符串,也是一一对应,不过是把数组里对应的元素赋值成‘T’(就这点小改动),最后遍历这个数组,只要有一个‘F’,那么证明短字符串没有包含在内,如果一个‘F’都没有,那么证明包含在内……

以此,我尝试写了个程序,但是依然输不出正确的结果,无论输入什么值,都是输出包含在内,请大大帮我看一下错在哪,谢谢!

代码如下:
(红色的部分是我为了查看中途变量的值而加上去的,可以不要这些)
#include<stdio.h>
#include<string.h>
void main()
{
 char long_str[]="ABCDEFG";
 char short_str[]="CKA";
 char num[26];
 int long_num,short_num,i,flag;
 long_num=strlen(long_str);
 short_num=strlen(short_str);
 printf("%d\n",long_num);
 printf("%d\n",short_num);
for(i=0;i<26;i++)
 {
  num[i]='T';
 }
 for(i=0;i<26;i++)
 {
  printf("%c",num[i]);
 }
 printf("\n");
for(i=0;i<short_num;i++)
 {
  if((short_str[i]>='A')&&(short_str[i]<='Z'))
  {
   num[i-'A']='F';
  }
 }
 for(i=0;i<26;i++)
 {
  printf("%c",num[i]);
 }
 printf("\n");
for(i=0;i<long_num;i++)
 {
  if((long_str[i]>‘A’)&&(long_str[i]<‘Z’))
  {
   num[i-'A']='T';
  }
 }
 for(i=0;i<26;i++)
 {
  printf("%c",num[i]);
 }
 printf("\n");
 flag=0;
 for(i=0;i<26;i++)
 {
  if(num[i]=='F')
  {
   flag=1;
  }
 }
 if(flag==0)
 {
  printf("yes\n");
 }
 if(flag==1)
 {
  printf("not\n");
 }
 printf("%d\n",flag);
}
搜索更多相关主题的帖子: 字符串 网站 元素 
2011-04-25 20:45
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:9 
我想你应该去看看KMP 如果看不懂就用字串回溯法  

就是从字串和主串的第一个字符起去比较 如果遇到的不同的

就把字串滑动到和主串的第二个字符去重复刚才的工作

给你个我写过的
程序代码:
#include <stdio.h>
#include <iostream.h>
int main()
{
     char a[] = "asdfff";
     char b[] = "ff";

     cout<<a<<endl<<b<<endl;

     int i = 0, j = 0, k = 0;
     for(i = 0; a[i] ;i++)
     {
          k = i;
          for(j = 0; b[j] ;j++)
          {
               if(a[i] == b[j])
                    i++;
               else
               {
                    i = k;
                    break;
               }
          }
          if(0 == b[j])
          {
               cout<<"找到子串"<<b<<endl<<
                    "在主串的起始位置为第"<<k+1<<"个字符"<<endl;
               break;
          }
     }
     if(0 != b[j])
     cout<<"没有找到"<<endl;
}

                                         
===========深入<----------------->浅出============
2011-04-25 20:53
H_K
Rank: 1
等 级:新手上路
帖 子:13
专家分:3
注 册:2010-11-30
收藏
得分:0 
回复 2楼 laoyang103
如果主字串和从字串都很长的话,那样时间开销会不会大了点啊?其实我感觉我刚看到的这个方法无论多长,只需把主字串、从字串各遍历一遍就可以了(前提是如果全是字母),呵呵,探讨一下,我只是不知道我错在哪?
2011-04-25 21:13
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:0 
我跟你说了  KMP的效率是最高的 你可以去看看

 如果你看不懂KMP 你在看我这个简单的 你的那个我没太看懂

                                         
===========深入<----------------->浅出============
2011-04-26 10:36
w123012306
Rank: 9Rank: 9Rank: 9
来 自:湖南
等 级:蜘蛛侠
威 望:4
帖 子:307
专家分:1180
注 册:2010-4-22
收藏
得分:0 
真的要去看看KMP了!   学c语言数据结构很重要

楼上,楼下的一定要幸福开心哦!
2011-04-26 11:16
succubus
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:635
专家分:1080
注 册:2007-10-7
收藏
得分:0 
以下是引用laoyang103在2011-4-26 10:36:39的发言:

我跟你说了  KMP的效率是最高的 你可以去看看

 如果你看不懂KMP 你在看我这个简单的 你的那个我没太看懂
“最”字可要慎用啊,朋友

[url=http:///view/aDU1]/image/aDU1.gif" border="0" />[/url]
2011-04-26 11:21
H_K
Rank: 1
等 级:新手上路
帖 子:13
专家分:3
注 册:2010-11-30
收藏
得分:0 
好吧,KMP我很难看懂,你写的我倒是看懂了,thanks!!!

但是我的那个,……纠结……

怎么查错呢?
2011-04-26 12:26
mm1010220cs
Rank: 2
等 级:论坛游民
帖 子:36
专家分:98
注 册:2011-4-7
收藏
得分:11 
改动如下:
void main()
{
    char long_str[]="ABCDEFG";
    char short_str[]="CKA";
    char num[26];
    int long_num,short_num,i,flag;
    long_num=strlen(long_str);
    short_num=strlen(short_str);
    printf("%d\n",long_num);
    printf("%d\n",short_num);
    for(i=0;i<26;i++)
    {
        num[i]='T';
    }
    for(i=0;i<26;i++)
    {
        printf("%c",num[i]);
    }
    printf("\n");
    for(i=0;i<short_num;i++)
    {
        if((short_str[i]>='A')&&(short_str[i]<='Z'))
        {
            num[int(short_str[i])-int('A')]='F';    //这里有改动
        }
    }
    for(i=0;i<26;i++)
    {
        printf("%c",num[i]);
    }
    printf("\n");
    for(i=0;i<long_num;i++)
    {
        if((long_str[i]>'A')&&(long_str[i]<'Z'))
        {
            num[int(short_str[i])-int('A')]='T';    //这里有改动
        }
    }
    for(i=0;i<26;i++)
    {
        printf("%c",num[i]);
    }
    printf("\n");
    flag=0;
    for(i=0;i<26;i++)
    {
        if(num[i]=='F')
        {
            flag=1;
        }
    }
    if(flag==0)
    {
        printf("yes\n");
    }
    if(flag==1)
    {
        printf("not\n");
    }
    printf("%d\n",flag);
 }
num[]初始26个字母为T,对短字符串的操作是将对应num中的字符改为F,
对长字符串的操作是将对应num中的字符改为T,如果F全部被改回成T,那么说明长字符串包含短字符串,
这么说大家对这个程序的方法应该理解了吧
2011-04-26 12:59
H_K
Rank: 1
等 级:新手上路
帖 子:13
专家分:3
注 册:2010-11-30
收藏
得分:0 
回复 8楼 mm1010220cs
大哥,还是你懂我
……
不过,编译时num[int(short_str[i])……]
这句貌似提示语法错误;
其实我觉得int型和char型在不溢出的情况下是可以互换的,不用再加int()了吧?
2011-04-26 14:34
mm1010220cs
Rank: 2
等 级:论坛游民
帖 子:36
专家分:98
注 册:2011-4-7
收藏
得分:0 
回复 9楼 H_K
恩,可以不加,只是为了让程序易读,还有就是我这里没提示有语法错误。顺便给加点分哈!
2011-04-26 19:02
快速回复:关于一道字符串排序问题
数据加载中...
 
   



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

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