String Notes

update Jan 10, 2018 20:16

概述

String 的常见问题可以归纳为如下几类:

  1. Char Removal

  2. De-duplication

  3. replace

  4. Reversal (swap)

  5. Substring

  6. shuffling

  7. Permutation

  8. Decoding/Encoding

  9. DP, longest substring

  10. matching

1. Char Removal

    input:  ____aaa___bb_cc__
    output: aaa_bb_cc

    即去掉input string的首位空格,并且每个词之前只保留一个空格。

基本思想是使用 two-pointers 的方法,i 和 j 分别对应左右指针。维持已经筛选过的部分在 i 的左边(i指向最后一个位置),用 j 一路向右扫描,需要更新的时候就把需要的字符赋值给 ++i; Java Code:

2. De-duplicate

还是two pointers。

用 stack。

  • Java Code:

基本思路是在每个单词结束之后插入一个space,跳过所有space,最后再检查删除头尾的space;

  • Java Code:

    3. Str-str

    经典题目,求一个string是否是另一个string的substring。基本方法是 O(len(small string)^2) 的时间复杂度,还有 KMP 和 Robin Karp 两个常见的 O(n) 时间的实现,但是一般来说不会考实现。

    4. Replacement

用一个指针扫描input string,用一个StringBuilder保存结果, 每次发现接下来的部分和 S match后,就append T,指针跳过len(S)个位置,否则的话就append当前字符,指针右移一位。

5. Decoding-Encoding, Compress

LeetCode: String Compressionarrow-up-right 整体思路是扫描input string,每次检查当前字母连续重复个数,然后相应inplace地去重新赋值。具体地,维持 l 和 r 两个指针,l 指向要返回的结果的最后一个位置,r 作为探测指针向右扫描。详见下面的comments。

6. Reversal

1, LeetCode: Reverse Stringarrow-up-right 两种方法,iterative 或者 recursion。 2, LeetCode: Reverse Words in a Stringarrow-up-right 稍微复杂,解答见 笔记arrow-up-right

7. Shuffling

8. Sliding window

解决需要在窗口中维持一种变量,并且这种变量可以根据窗口边界元素的进出进行更新的问题。例如

  1. 找s1中全部的s2的同分异构串;

  2. 找最长的仅包含unique characters 的 substring;

  3. 对于一个只含有 0 和 1 的字符串,最多反转 k 个 0,求可以生成的最长全是 1 的子串;