博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程之美3-1:字符串移位包含问题.
阅读量:4316 次
发布时间:2019-06-06

本文共 1083 字,大约阅读时间需要 3 分钟。

题目:

  给定两个字符串s1和s2,要求判断s2是否被包含在s1或者通过s1循环移位的串.比如s1="ABCD",s2="CDA".很显然符合.而s1="ABCD",S2="CBA".则不符合.

 

解法:

  法一:很容易想到的方法是直接枚举法.即依次找到s2的各个循环移位并且同时判断是否包含在s1中.strstr函数可以满足判断字串判断.代码:

#include "stdio.h"#include "stdlib.h"#include "string.h"char s1[]="AABCD";char s2[]="CDA";int main(){    int len,i,j;    char tempchar;    len=strlen(s1);    for(i=0;i

这个解法简单好想,但是问题很明显就是效率问题.要知道如果给的字符串非常的长,那么想必运行时间会加大.

 

解法2:

  这个题目有个隐含条件就是s1的长度应该是一定比s2的长.否则可以直接判断不存在题目所说的那种可能.再看一下s1循环移位的结果:

    AABCD---ABCDA---BCDAA---CDAAB---DAABC---AABCD

  其实可以发现如果把我们连接第1项与第6项可以得到AABCDAABCD.再看看可以知道所有AABCD的移位字串都包含在AABCDAABCD中.所以可以直接判断s2是否包含在s1是中来判断是否包含在s1的循环移位串当中.AABCDAABCD任何一个字串都可以通过s1的字串或者s1循环移位后的字串得到.这一点保证了这个算法的正确性.

 

#include "stdio.h"#include "string.h"#include "malloc.h"char s1[]="AABCD";char s2[]="CAD";int main(){    int len,i;    char *s;    len=strlen(s1);    printf("%d\n",sizeof(s1));    s=(char*)malloc(sizeof(s1)*2-1);    //分配2倍s1的空间用于保存AABCDAABCD    for(i=0;i

 

这里同样有个问题是当字符串非常的长的时候那么必然带来了空间的问题.所以这个算法等于是用空间来换时间的.空间与时间往往很难同时满足,只有按照特定情况取舍.但是明显算法二的算法要好很多.

  

转载于:https://www.cnblogs.com/brillliu/p/3550716.html

你可能感兴趣的文章
使用类的成员函数来实现回调函数
查看>>
Win form碎知识点
查看>>
避免使用不必要的浮动
查看>>
cocos2dx 编辑框 CCEditBox
查看>>
第一节:ASP.NET开发环境配置
查看>>
PHP全栈学习笔记7
查看>>
表单脚本基础知识
查看>>
开源分享 Unity3d客户端与C#分布式服务端游戏框架
查看>>
浏览器默认缓存时间-(为什么浏览器时而缓存,时而不缓存)
查看>>
2013年最佳的16个 Photoshop 设计教程推荐
查看>>
15个优秀的 Material Design(材料设计)案例
查看>>
sql 列转行
查看>>
Html5 手机端网页不允许缩放
查看>>
Myeclipse 常用操作(待补充)
查看>>
PHP 获取当前所在的类名、方法名等
查看>>
基本数据类型和引用类型
查看>>
关于移动端APP开发-字体样式变大问题
查看>>
leetcode4568
查看>>
First 5 Minutes Troubleshooting A Server
查看>>
sqlserver database常用命令
查看>>