syntax highlighter

2013年9月17日星期二

Leetcode string 类的简单题目

这类题目重点是思路,而且思路也都不难。 这类题目算是面试当中频率不低,应该拿下。
1. Longest Palindromic Substring
这道题思路是设定pivot i, 从0到n-1 对每一个i ,以i为中心,向两侧扩展直到不是回文。注意回文的两种可能,单数个字符和双数个字符。

2. ZigZag Conversion
这道题的思路是,为每一行设置一个字符序列,一个指针按之字型从上到下到上的周期性扫描。每次到达的位置和行数一一对应起来,并把这个位置的字符插入到该行的字符串(序列)中即可。 首先看这个周期,假设给定行是nRows, 那么指针从开始竖值走下来到底,行号递增一;然后变换方向,斜向上走到顶,也是行好递减一,至此一个周期走完。这个周期是竖直下来的nRows和斜向上的nRows-2 (去掉斜线的首位两个,因为已经分别算在了上半个周期和下个周期内),因此周期是2*nRows-2. 第二我们看行号,前半个周期行号递增一,后半个周期行号递减一,我们只需要把前半个周期和后半个周期的转折点找到即可,显然它是最后一行,nRows-1.

3. Longest Common Prefix
思路很简单,从每个字符串首字符开始检查当前字符串的首字符是否和下一个字符串的首字符相等。是则继续,否则退出,找到了答案。

4. length of Last Word
这道题思路简单,但是要特别注意corner case。 "a  ", "  " 等等。 一言以蔽之, 就是one pass 字符串,遇到非空格字符,当前字符长度就自增一,直到遇到空格字符长度就清零。但清零是需注意这个空格后还有没有非空格字符串,如果有则可以清零,否则不可以,因为当前求得字符串就是last word 另一种方法,用一个变量tmp记录前一个非负的count数。这样可以处理“a ”的情况
5. Valid Palindrome 这道题思路简单。首尾两个指针,遇到非字母数字的字符,无条件的向中间靠拢。遇到字符数字,比较两个指针的指向的值是否相同。不同的话就返回false
6. Implement strStr() 字符串匹配
这道题如果用brute force的方法,思路也比较简单。从匹配串的首字符开始依次比较是否与模式串相对应的字符相等。 KMP 和 rolling hash可以提高算法的效率。大部分面试不要求能写出来。
KMP 7. Reverse Words in a String
这道题要注意空字符串和首尾有空格的情况。思路就是从最后一位开始向前遍历,忽略空格。把遇到的非空格字符串拿出来加入到新字符串中(注意单个word不需要reverse或者reverse两遍)。 8. Anagrams
Given an array of strings, return all groups of strings that are anagrams.
下面这个答案在网上流传很多,实际上是错的。如果input是 vector a; a.push_back("abcd"); a.push_back("bcde"); a.push_back("cdef"); a.push_back("bcda"); a.push_back("decb"); a.push_back("edfc"); a.push_back("adcb"); a.push_back("acdb"); 结果是 abcd,bcda.bcde,decb,cdef,edfc,adcb,acdb leetcode 的test case应该没有考虑多个anagram group的情况 正确的做法应该是:

没有评论:

发表评论