`
kenby
  • 浏览: 717091 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

编程之美3.1 字符串移位包含的问题

 
阅读更多

题目

给定两个字符串 s1 和 s2, 要求判定 s2 是否能够被通过 s1 作循环移位 ( rotate )

得到的字符串包含. 例如, 给定 s1 = AABCD 和 s2 = CDAA, 返回 true; 给定

s1 = ABCD 和 s2 = ACBD, 返回 false.

 

 

解法1

直接模拟, 对 s1 进行循环移位, 在判断字符串 s2 是否在移位后的字符串中.

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

int main()
{
	char src[] = "AABBCD";
	char des[] = "CDAA";

	int len = strlen(src);
	int i, j;

	for (i = 0; i < len; i++) {
		char tempchar = src[0];
		for (j = 0; j < len - 1; j++) {
			src[j] = src[j + 1];
		}
		src[j] = tempchar;
		if (strstr(src, des) == 0) {
			printf("Yes\n");
			getchar();
			return 1;
		}
	}
	printf("No\n");
	getchar();
	return 0;
}
 

解法2

其实没必要对 s1 进行真正的移位, 依次从 s1[0], s1[1], ... 开始比较, 如果 s1 的下标超出范围, 就对

其取余, 这样就相当于延长字符串 s1 了.

 

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


int main()
{
	char src[] = "AEBBCD";
	char des[] = "CDAE";

	int len_src = strlen(src);
	int len_des = strlen(des);
	int i, j, k;

	for (i = 0; i < len_src; i++) {
		j = i;
		k = 0;
		while (src[j] == des[k]) {
			j = (j + 1) % len_src;
			k++;
		}
		if (k == len_des) {
			printf("Yes\n");
			getchar();
			return 1;
		}
	}
	printf("No\n");
	getchar();
	return 0;
}
 

解法3

解法2通过取余数的方法, 达到延长字符串的目的, 当然这是一种伪延长, 我们也可以把

s1 延长成 s1s1, 那么对 s1 做循环移位所得到的字符串都将是字符串 s1s1 的子字符串.

如果 s2 可以由 s1 循环移位得到, 那么 s2 一定在 s1s1 上. 至此我们将问题转换成考察

s2 是否在 s1s1 上, 可通过调用一次 strstr 函数得到结果. 

 

总结

解法1直接模拟, 效率最低, 解法3是典型的空间换时间的做法, 解法2是解法1和解法3的折中,

既不需要额外的空间, 也不需要对字符串做移动

 

分享到:
评论

相关推荐

    C 语言编程常见问题解答.chm

    C 语言编程常见问题解答 【作者】[美]Paul S.R. Chisholm 译:张芳妮 吕 波 【出版社】清华大学出版社 C语言编程常见问题解答(目录) 第l章 C语言 1. 1 什么是局部程序块(local block)? 1. 2 可以把变量保存...

    宋劲彬的嵌入式C语言一站式编程

    2.7. 以字符串为单位的I/O函数 2.8. 以记录为单位的I/O函数 2.9. 格式化I/O函数 2.10. C标准库的I/O缓冲区 2.11. 本节综合练习 3. 数值字符串转换函数 4. 分配内存的函数 26. 链表、二叉树和哈希表 1. 链表 1.1. ...

    C#编程经验技巧宝典

    76 &lt;br&gt;0111 计算字符串中子字符串出现的次数 76 &lt;br&gt;0112 获得字符串中大写字母的个数 77 &lt;br&gt;0113 获得某字符在字符串中最后出现的位置 78 &lt;br&gt;0114 如何找出字符串中某一字符的所有位置 78...

    编程思想下篇

    3.13 字符串操作符 + 和 += 3.14 使用操作符时常犯的错误 3.15 类型转换操作符 3.15.1 截尾和舍入 3.15.2提升 3.16 Java没有“sizeof” 3.17 操作符小结 3.18 总结 第4章 控制执行流程 4.1 true和false 4.2 if-else ...

    游戏编程指南 doc

    1.7 指针、数组与字符串 17 1.7.1 指针 17 1.7.2 数组 19 1.7.3 字符串 21 1.7.4 小结 22 1.8 多文件程序的结构 22 1.9 常用函数 24 第二章 如何说得更地道 28 2.1 定义和使用类 28 2.2 类的构造函数 31 2.3 ...

    The Art of Assembly Language

    内容涉及到数据表示、存储器管理、各种数据类型、过程、与汇编语言相关的体系结构、控制结构、文件、宏指令、位处理指令、字符串指令、MMX指令、类和对象,以及混合语言编程等,尤其是在高级汇编语言(HLA)方面,该...

    《C语言高级编程与实例剖析》源码

    4.7.2 文本输出字符串函数 133 4.7.3 定义文本字型函数 135 4.8 动画技术 137 4.8.1 动态开辟图视口的方法 137 4.8.2 利用显示页和编辑页交替变化 138 4.8.3 利用画面存储再重放的方法 139 4.8.4...

    LabVIEW入门教程

    7.3.6 Spreadsheets(电子表格)字符串和文件I/O 7.3.7 表 7.4 小结、提示和技巧 习题 第8章 VI选项 8.1 VI的建立 8.1.1 执行选项 8.1.2 窗口选项 8.1.3 文档选项 8.2 SubVI节点设置 8.3 小结、提示和技巧 第9章 ...

    visualC++2010入门经典源代码

    4.5.1 查找以空字符结尾的字符串的长度 174 4.5.2 连接以空字符结尾的字符串 174 4.5.3 复制以空字符结尾的字符串 176 4.5.4 比较以空字符结尾的字符串 177 4.5.5 搜索以空字符结尾的字符串 177 4.6 c++/cli...

    [Visual.C++.2010入门经典(第5版)].Ivor.Horton.part1

    4.5.1 查找以空字符结尾的字符串的长度 174 4.5.2 连接以空字符结尾的字符串 174 4.5.3 复制以空字符结尾的字符串 176 4.5.4 比较以空字符结尾的字符串 177 4.5.5 搜索以空字符结尾的字符串 177 4.6 c++/cli编程 179...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    4.5.1 查找以空字符结尾的字符串的长度 174 4.5.2 连接以空字符结尾的字符串 174 4.5.3 复制以空字符结尾的字符串 176 4.5.4 比较以空字符结尾的字符串 177 4.5.5 搜索以空字符结尾的字符串 177 4.6 C++/CLI...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    1.8 数组、字符串和指针 1.8.1 数组 1.8.2 字符串 1.8.3 指针 1.9 文件 1.10 与操作系统有关的内容 1.10.1 编写和运行c程序 1.10.2 中断程序 1.10.3 输入文件尾标志 1.10.4 输入和输出的重定向 1.11 总结 1.12 练习 ...

    游戏编程指南

    1.7 指针、数组与字符串... 17 1.7.1 指针... 17 1.7.2 数组... 19 1.7.3 字符串... 22 1.7.4 小结... 23 1.8 多文件程序的结构... 23 1.9 常用函数... 25 第二章 如何说得更地道... 29 2.1 定义和使用类... 29 2.2 ...

    java编程规范(第三版)

    5.4 字符串转换 77 5.5 强制转换 77 5.6 数值提升 82 第6章 名称 85 6.1 声明 86 6.2 名称和标识符 86 6.3 声明的作用域 88 6.4 成员和继承 92 6.5 确定名称的含义 95 6.6 访问控制 104 6.7 完全限定的...

    C语言编程要点

    12.5. 对字符串进行操作的标准库函数有哪些? 173 12.6. 对内存进行操作的标准库函数有哪些? 176 12.7. 怎样判断一个字符是数字、字母或其它类别的符号? 178 12.8. 什么是“局部环境(locale)”? 179 12.9. 有没有办法...

    Java范例开发大全 (源程序)

     实例42 字符串索引越界异常(StringIndexOutBounds) 60  实例43 操作错误(UnsupportedOperationException) 60  4.2 运行时异常 61  实例44 找不到指定类时发生的异常(ClassNotFoundException) 62  ...

    java范例开发大全(pdf&源码)

    实例42 字符串索引越界异常(StringIndexOutBounds) 60 实例43 操作错误(UnsupportedOperationException) 60 4.2 运行时异常 61 实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 实例45 请求的...

    java范例开发大全源代码

     实例42 字符串索引越界异常(StringIndexOutBounds) 60  实例43 操作错误(UnsupportedOperationException) 60  4.2 运行时异常 61  实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 ...

    java范例开发大全

    实例42 字符串索引越界异常(StringIndexOutBounds) 60 实例43 操作错误(UnsupportedOperationException) 60 4.2 运行时异常 61 实例44 找不到指定类时发生的异常(ClassNotFoundException) 62 实例45 请求的...

Global site tag (gtag.js) - Google Analytics