西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发VC|VC++ → 字符串移位包含的问题的解决方案

字符串移位包含的问题的解决方案

相关软件相关文章发表评论 来源:西西整理时间:2013/5/23 21:21:22字体大小:A-A+

作者:西西点击:28次评论:0次标签: 字符串

  • 类型:电子教程大小:9.5M语言:中文 评分:8.0
  • 标签:
立即下载

问题描述:

给定两个字符串s1和s2,要求判定s2是否能被s1循环移位(rotate)得到的字符串包含。例如,给定字符串s1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD返回false。

分析:

从问题的描述来看,最直接的方式就是对字符串s1进行循环移位,再判断s1是否包含s2. 关于字符串匹配可以使用KMP算法,这不是本问题的中心,因此我们使用库函数strstr来匹配。char* strstr(char *haystack, char *needle);如果needle为haystack的子串则返回出现的位置,否则返回NULL。

解法一:

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

int main(void)
{
     char a[] = "AABCD";
     char b[] = "CDAA";
 
     int i, j, res;
     char tmp;
     int len = strlen(a);
 
     for(i = 0; i < len; i++)
     {
         tmp = a[0];
         for(j = 0; j < len-1; j++)
        {
             a[j] = a[j+1];
          }
         a[len-1] = tmp;
 
         if(strstr(a,b))
          {
             printf("OK");
             return 0;
         }
     }
     printf("NOT OK");
 
     return 0;
}

这样做的时间代价是很高的,如果匹配不到,则总共进行了n-1次循环移位和匹配。

 那么,有没有其他办法可以不用穷举s1每次循环移位的结果呢?

我们先来观察以下s1循环移位后到底是什么样子?

“AABCD"->"ABCDA"->"BCDAA"->"CDAAB"->"DAABC"

s2=“CDAA”

从上面可以看出来,解法1有很多重复的匹配。例如“CDAA”在匹配到“CD”以后需要循环移位一次重新匹配“CDA”然后“CDAA”,所以主要时间浪费在了循环移位s1上。那么一个比较简单的想法就是如果能让s2=“CDAA”直接去匹配像“CDAAB”这样的串就可以了。

如果仅仅是把s1的前面每一位“接”到其末尾,那么“AABCDAABCD”就可以对s2进行直接匹配。事实上,如果length(s2)<=length(s1)的情况下,如果s1s1包含s2,那么其循环移位的结果也是包含s2的。

解法二:

#include<stdio.h>

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

int main(void)
{
  char a[] = "AABCD";
  char b[] = "CDAA";
  char c[] = "AABCDAABCD"
  if(strstr(c,b)!=NULL)
     printf("OK");
  else
     printf("NOT OK");
   return 0;   
}

解法二用空间换取了大量的计算时间。只需要一次匹配即可得到结果。

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(0)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)