【字符串】字符串逆序

字符串

题目一:

如果一个字符串 str ,把字符串 str 前面的任意部分挪到后面去形成的字符串叫做 str 的旋转词。比如 str = “ 1234 ” , 那么 str 的旋转词有 “ 1234 ” , “ 2341 ” , “ 3412 ” , “ 4123 ” 。给定两个字符串 a 和 b ,请判断 a 和 b 是否互为旋转词?

举例:

a = ” cdab ” , b = ” abcd ” 。返回 true。

a = ” 1ab2 ” , b = ” ab12 ” 。返回 false。

a = ” 2ab1 ” , b= ” ab12 ” 。 返回 true。

思路:

最优解时间复杂度为 O(N)

  • 先判断字符串 a 和 b 是否长度相等。
  • 如果长度相等,生成 a + a 的大字符串。
  • 然后判断大字符串中是否包含 b 字符串。(使用 kmp 算法判断)如果大字符串中包含字符串 b ,那么字符串 a 和 b 就互为旋转词。

举例:

a = ” 1234 “

a + a = ” 12341234 “

很明显发现,如果字符串 a 的长度为 N,在 a + a 的大字符串中,任意一个长度为 N 的子串都是 a 的旋转词。


题目二:

给定一个字符串 a, 请在单词间做逆序调整。

举例:

” pig loves dog ” 逆序成 ” dog loves pig ” 。

” I’m a student. ” 逆序成 ” student. a I’m ”

思路:
  • 实现将字符串局部所有字符逆序的函数 f
  • 利用 f 将字符串所有字符逆序
  • 找到逆序后的字符串中每一个单词的区域,利用 f 将每一个单词的区域逆序

这里写图片描述


题目三:

给定一个字符串 a 和一个整数 i。N为字符串的长度,i 为 a 中的位置,将 a [ 0 … i ] 移到右侧,a [ i + 1 … N - 1 ]移到左侧。

举例:

a = ” ABCDE ” ,i = 2 。将 str 调整为 ” DEABC ” 。

要求:时间复杂度为 O(N),额外空间复杂度为 O(1)。

思路:
  • 先将 a[ 0 … i ] 部分的字符逆序

    这里写图片描述

  • 再将 a[ i + 1 … N - 1 ] 部分的字符逆序

    这里写图片描述

  • 最后将整体的字符 a 逆序

    这里写图片描述


题目四:

给定一个字符串类型的数组 strs,请找到一种拼接顺序,使得将所有的字符串拼接起来组成的大字符串是所有可能性中字典顺序最小的,并返回这个字符串。

举例:

strs = [ ” abc ” , ” de ” ],可以拼接成 ” abcde “,也可以拼接成 ” deabc “,但是前者的字典顺序更小,所以返回 ” abcde ” 。

strs = [ ” b “, ” ba ” ], 可以拼接成 ” bba “, 也可以拼接成 ” bab “,但是后者的字典顺序更小,所以返回 ” bab “。

思路:

最优解的时间复杂度O(N*logN),其实质是一种排序的实现。

这里写图片描述

这里写图片描述

方案二中是比较两个字符串彼此拼接后的字典顺序,所以能成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhisheng_blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值