令人头大的字符串

引言

字符串可以看成是字符组成的数组。由于字符串是程序里经常需要处理的数据类型,因此有很多针对字符串处理的题目。

字符串比较

242. Valid Anagram
我们可以利用哈希表或者数组统计两个数组中每个数字出现的频次,若频次相同,则说明它们包含的字符完全相同。

205. Isomorphic Strings
我们可以将问题转化一下:记录两个字符串每个位置的字符第一次出现的位置,如果两个字符串中相同位置的字符与它们第一次出现的位置一样,那么这两个字符串同构。

647. Palindromic Substrings
我们可以从字符串的每个位置开始,向左向右延长,判断存在多少以当前位置为中轴的回文子字符串。

696. Count Binary Substrings
从左往右遍历数组,记录和当前位置数字相同且连续的长度,以及其之前连续的不同数字的长度。若不同数字的连续长度大于等于当前数字的连续长度,则说明存在一个且只存在一个以当前数字结尾的满足条件的子字符串。

字符串理解

227. Basic Calculator II
如果我们在字符串左边加上一个加号,可以证明其并不改变运算结果,且字符串可以分割成多个 (opt, num) 的形式;这样一来我们就可以从左往右处理了。

字符串匹配

28. Find the Index of the First Occurrence in a String
使用著名的 KMP 算法,可以在 O(m+n) 时间利用动态规划完成匹配。

练习

409. Longest Palindrome
计算一组字符可以构成的回文字符串的最大长度,可以利用其它数据结构进行辅助统计。

3. Longest Substring Without Repeating Characters
计算最长无重复子字符串,同样的,可以利用其它数据结构进行辅助统计。

772. Basic Calculator III
227. Basic Calculator II 的 follow-up,十分推荐练习。

5. Longest Palindromic Substring
类似于我们讲过的子序列问题,子数组或子字符串问题常常也可以用动态规划来解决。先使用动态规划写出一个 O(n^2) 时间复杂度的算法,再搜索一下 Manacher’s Algorithm,它可以在 O(n) 时间解决这一问题。