数据结构与算法04-字符串
字符串
aolaf
这个作者很懒,什么都没留下…
展开
-
08 重复的子字符串(leecode 459)
1 问题 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 示例 1: 输入: “abab” 输出: True 解释: 可由子字符串 “ab” 重复两次构成。 示例 2: 输入: “aba” 输出: False 示例 3: 输入: “abcabcabcabc” 输出: True 解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。) 2 解法 假设字符串s的长度为:len。s的next 数原创 2021-01-30 14:47:37 · 81 阅读 · 0 评论 -
07 实现 strStr()(leecode 28)
1 问题 实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。 示例 1: 输入: haystack = “hello”, needle = “ll” 输出: 2 示例 2: 输入: haystack = “aaaaa”, needle = “bba” 输出: -1 说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的原创 2021-01-29 12:57:07 · 63 阅读 · 0 评论 -
06 KMP算法深度解析
1 KMP算法的用途 KMP算法主要用于解决字符串的匹配问题。 KMP的主要思想是「当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。」 所以如何记录已经匹配的文本内容,是KMP的重点,也是next数组肩负的重任。 2 KMP算法的使用 2.1 字符串的前缀集合和后缀集合 字符串的前缀指的是不包含最后一个字符的全部子串。 字符串的后缀指的是不包含第一个字符的全部子串。 示例: harry的前缀包括 {‘h’, ‘ha’, ‘har’, ‘harr’ } har原创 2021-01-28 20:07:01 · 182 阅读 · 0 评论 -
05 翻转字符串里的单词(leecode 151)
1 问题 给定一个字符串,逐个翻转字符串中的每个单词。 说明: 无空格字符构成一个单词 。 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。 示例 1: 输入:“the sky is blue” 输出:“blue is sky the” 示例 2: 输入:" hello world! " 输出:“world! hello” 解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 示例 3: 输原创 2021-01-28 15:54:54 · 149 阅读 · 0 评论 -
04 左旋转字符串(剑指Offer58-II)
1 问题 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 示例 1: 输入: s = “abcdefg”, k = 2 输出: “cdefgab” 示例 2: 输入: s = “lrloseumgh”, k = 6 输出: “umghlrlose” 限制: 1 <= k < s.length <= 10000 2 解法 可以通过局部反转原创 2021-01-27 20:14:40 · 135 阅读 · 0 评论 -
03 替换空格(剑指Offer 05)
1 问题 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1: 输入:s = “We are happy.” 输出:“We%20are%20happy.” 2 解法 首先扩充数组到每个空格替换成"%20"之后的大小。 然后从后向前替换空格,也就是双指针法,过程如下: i指向新长度的末尾,j指向旧长度的末尾。 「其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。」 这么做有两个好处: 1.不用申请新数组。 2.从后向前填充元素,避免了从前先后填充元素要原创 2021-01-27 19:43:33 · 74 阅读 · 0 评论 -
02 反转字符串II(leecode 541)
1 问题 给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。 如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。 示例: 输入: s = “abcdefg”, k = 2 输出: “bacdfeg” 2 解法 class Solution { public: //反转函数 void reverse(string& s, int begin,原创 2021-01-27 18:52:08 · 118 阅读 · 0 评论 -
01 反转字符串(leecode 344)
1 问题 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。 示例 1: 输入:[“h”,“e”,“l”,“l”,“o”] 输出:[“o”,“l”,“l”,“e”,“h”] 示例 2: 输入:[“H”,“a”,“n”,“n”,“a”,“h”] 输出:[“h”,“a”,“n”,“n”,“a”,“H”] 2原创 2021-01-27 16:28:01 · 510 阅读 · 0 评论