数据结构与算法:字符串
2016-06-13 20:55
337 查看
将字符串逆序
普通逆序
原地逆序
不允许临时变量的原地逆序
按单词逆序
如何实现逆序打印
找出一个字符串中第一个只出现一次的字符
输出字符串的所有组合
(1)设置两个指针,分别指向字符串的头部和尾部,然后交换两个指针所指的字符,并向中间移动指针直到交叉。
(2)递归,需要给定逆序的区间,调用方法 Reverse(s,0,strlen(s)),对字符串s在区间left和right之间进行逆序。
(3)非递归,同样指定逆序区间,和 普通逆序方法 没有本质区别,一个使用指针,一个使用下标。
(1)异或操作
(2)使用字符串结束符’\0’所在的位置作为交换空间
另外,可以用一个buffer数组记录当前找到的只出现一次的字符,避免对原字符串进行第二次遍历。
根据题意,如果字符串中有n个字符,那么一共需要输出 2^n-1 种组合。
最容易想到的方式是递归法,遍历 字符串,每个字符只能取或不取。取该字符的话,就把该字符放到结果字符串中,遍历完毕后,输出结果字符串
另一种方法是用二进制串表示。
普通逆序
原地逆序
不允许临时变量的原地逆序
按单词逆序
如何实现逆序打印
找出一个字符串中第一个只出现一次的字符
输出字符串的所有组合
将字符串逆序
给定一个字符串s,将s中的字符顺序颠倒过来,如 s=’abcd’,逆序后变成 s=’dcba’。可以采用多种方法对字符串进行逆序,一下将对其中的一些方法进行分析普通逆序
直接分配一个与原字符串等长的字符数组,然后反向拷贝即可原地逆序
原地逆序不允许额外分配空间,就是将字符串两边的字符逐个交换。例如,给定字符串 “abcd”,逆序的过程分别是交换字符a和d,交换字符b和c。实现原地逆序的方式有以下3种。。(1)设置两个指针,分别指向字符串的头部和尾部,然后交换两个指针所指的字符,并向中间移动指针直到交叉。
(2)递归,需要给定逆序的区间,调用方法 Reverse(s,0,strlen(s)),对字符串s在区间left和right之间进行逆序。
(3)非递归,同样指定逆序区间,和 普通逆序方法 没有本质区别,一个使用指针,一个使用下标。
不允许临时变量的原地逆序
原地逆序虽然没有额外分配空间,但还是使用了临时变量,占用了额外的空间。如果不允许使用额外空间,主要有以下两种方法:第一种是异或操作,因为异或操作可以交换两个变量而无需借助第三个变量;第二种是使用字符串的结束符‘\0’所在的位置作为交换空间,但这有个局限,只适合以’\0’结尾的字符串,对于不支持这种字符串格式的语言,就不能使用了。(1)异或操作
(2)使用字符串结束符’\0’所在的位置作为交换空间
按单词逆序
给定一个字符串,按单词将该字符串逆序。例如,给定“ This is a sentence”,则输出是“ sentence a is This”,为了简化问题,字符串中不包含标点符号。一共分两个步骤,第一步先按单词逆序得” sihT si a ecnetnes”,第二步整个句子逆序如何实现逆序打印
与上题类似,还有一类题目要求逆序输出,而不要求真正地逆序存储。对于这个问题,可以首先求出字符串长度,然后反向遍历即可。找出一个字符串中第一个只出现一次的字符
如何找出一个字符串中第一个只出现一次的字符?例如,输入abac,则输出b。本题可以采用hash法来实现。首先申请一个长度为256的表,对每个字符hash计数即可。因为C/C++中的char有3种类型:char、signed char 和unsigned char。 char类型的符号是由编译器指定的,一般是有符号的,在对字符进行hash时,应该先将字符转为无符号类型;否则当下标为负值时,就会出现越界访问。另外,可以用一个buffer数组记录当前找到的只出现一次的字符,避免对原字符串进行第二次遍历。
输出字符串的所有组合
如何输出字符串的所有组合?例如,“abc”输出 a、b、c、ab、ac、bc、abc,假设字符串中的所有字符都不重复。根据题意,如果字符串中有n个字符,那么一共需要输出 2^n-1 种组合。
最容易想到的方式是递归法,遍历 字符串,每个字符只能取或不取。取该字符的话,就把该字符放到结果字符串中,遍历完毕后,输出结果字符串
另一种方法是用二进制串表示。
相关文章推荐
- Java数据结构之简单的连接点(link)实现
- Java数据结构之有效队列
- 数据结构学习-二叉树的基本运算
- 数据结构(线段树):CodeForces 85D Sum of Medians
- web服务器之mongoose:数据结构
- python 的数据结构
- 数据结构中的堆
- 大话数据结构——树
- 数据结构与算法:链表
- 数据结构--哈夫曼树
- 数据结构 单链表逆序
- 数据结构—哈夫曼编码应用
- 数据结构(LCT动态树):BZOJ 1036: [ZJOI2008]树的统计Count
- 0-1背包问题与数组分割问题
- Nginx 基础数据结构
- 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司
- 数据结构第七次试验
- 数据结构(线段树):SPOJ GSS3 - Can you answer these queries III
- thrift数据结构
- 数据结构算法模拟系统