题目一:
如果一个字符串 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),其实质是一种排序的实现。
方案二中是比较两个字符串彼此拼接后的字典顺序,所以能成功。