代码随想录第九天

Source

专题:字符串

题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。

比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

题目解析: 我们可以采用,0到i 个翻转,然后 i到n 翻转,再实现,0到n的翻转。这样就实现了,字符串前i个元素的左旋转。

代码实现: 

还可以采用方法,就是 新创建一个字符串,然后将旧字符串的前0到i个字符,放到新字符串的后面,把就字符串的i到n个字符串,放到新字符串的前面。

代码实现:

 题目二实现strstr()

实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1。

示例 1: 输入: haystack = "hello", needle = "ll" 输出: 2

示例 2: 输入: haystack = "aaaaa", needle = "bba" 输出: -1

题目解析:利用字符串就能得到 这个字符串的前缀表next数组,然后再进行文本 和 字符串 匹配 的过程中,一旦发现字符串元素和文本的元素不匹配,此时在next数组里面查找,字符串此时应该回退到那个位置,而不像暴力法一样,要重头开始匹配。KMP更节省时间。

KMP的解析:    

只需要字符串就可以拿到这个字符串对应的前缀表,即next数组。前缀表里面保存的就是,当前位置前面所有元素的相同前后缀最大长度数。像上面的next:010120.表示的就是,在第一个元素时,此时字符串的最长相等前后缀数就是0,在第二个位置时,此时字符串的最长相等前后缀就是1.在第三个位置时,此时字符串的最长相等前后缀就是0.在第四个位置时,此时字符串的最长相等前后缀就是1.在第五个位置时,此时字符串的最长相等前后缀就是2.在第六个位置时,此时字符串的最长相等前后缀就是0.

 此时就已经拿到了这个字符串的前缀表,即next数组。

然后进行字符串和 文本的匹配过程,一旦不匹配的时候,就去查这个字符串的前缀表,即next数组,看此时应该回退到字符串的那个位置。

 题目三:重复的子字符串

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成

 题目解析:也使用到了KMP算法。其实也不难吧。原理清楚也不难。

使用移动匹配法,它是一种解决问题很好的算法。find()的底层实现,算法时间复杂度(m+n)

算法思想简单,如果这个字符串是由小字符串构造出来的,那么2个原来的大字符串拼接在一起,让s1小字符串的后半部分 和 s2小字符串的前半部分,重新组成一个新的小字符串。然后在新的字符串里面查找,查到的话就说明它是。

 

 使用KMP算法: