数据结构与算法:字符串

将字符串逆序

给定一个字符串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 种组合。

最容易想到的方式是递归法,遍历 字符串,每个字符只能取或不取。取该字符的话,就把该字符放到结果字符串中,遍历完毕后,输出结果字符串

另一种方法是用二进制串表示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值