计算机

Leetcode - Is Subsequence

2016-09-21  本文已影响122人  Richardo92

My code:

public class Solution {
    public boolean isSubsequence(String s, String t) {
        if (s == null || t == null) {
            return false;
        }
        else if (t.length() < s.length()) {
            return false;
        }
        
        int pre = 0;
        for (int i = 0; i < s.length(); i++) {
            char curr = s.charAt(i);
            int index = t.indexOf("" + curr, pre);
            if (index == -1) {
                return false;
            }
            pre = index + 1;
        }
        return true;
    }
}

reference:
https://discuss.leetcode.com/topic/57205/java-only-2ms-much-faster-than-normal-2-pointers

public class Solution {
    public boolean isSubsequence(String s, String t) {
        if (s == null || t == null) {
            return false;
        }
        else if (t.length() < s.length()) {
            return false;
        }
        else if (s.length() == 0) {
            return true;
        }
        
        int j = 0;
        char target = s.charAt(0);
        for (int i = 0; i < t.length(); i++) {
            char curr = t.charAt(i);
            if (curr == target) {
                j++;
                if (j >= s.length()) {
                    return true;
                }
                target = s.charAt(j);
            }
        }
        return false;
    }
}

reference:
https://discuss.leetcode.com/topic/57241/simple-java-code-with-explanation

public class Solution {
    public boolean isSubsequence(String s, String t) {
        if (s == null || t == null) {
            return false;
        }
        else if (t.length() < s.length()) {
            return false;
        }
        else if (s.length() == 0) {
            return true;
        }
        
        List<Integer>[] idx = new List[256];
        for (int i = 0; i < t.length(); i++) {
            char curr = t.charAt(i);
            if (idx[curr] == null) {
                idx[curr] = new ArrayList<Integer>();
            }
            idx[curr].add(i);
        }
        
        int pre = 0;
        for (int i = 0; i < s.length(); i++) {
            char curr = s.charAt(i);
            if (idx[curr] == null) {
                return false;
            }
            List<Integer> list = idx[curr];
            int index = Collections.binarySearch(list, pre);
            if (index < 0) {
                index = -index - 1;
            }
            if (index >= list.size()) {
                return false;
            }
            pre = list.get(index) + 1;
        }
        return true;
    }
}

reference:
https://discuss.leetcode.com/topic/58367/binary-search-solution-for-follow-up-with-detailed-comments

用三种不同的做法都写了下。其实都是 greedy思想的延伸。
前两个做法很相似。就是根据在t中找到s对应character 的index,然后一步步缩小搜索范围。

第三种做法其实也是这个原理,只不过用了binary search 来实现。每次搜索的时间是 O(log M), M = size of that sub list
可以说,接近于常数级操作。

介绍下 ,Collections.binarySearch 这个函数。
如果传入的list包含target,那就返回他的index
如果不包含,返回一个数, index which is < 0
我们做如下转换:
index = -index - 1;
就可以得到这个target如果插入list,应该插入的index

所以一开始pre = 0,如果0 这个index不在对应的list里面,那么就会返回 -1 => 转换得到0,
就代表,s中的这个character,应该对应于t中的index这个位置。
就是上面解法的 pre
然后一步步缩小范围。
其实也是 Greedy 思想的延伸。

Anyway, Good luck, Richardo! -- 09/20/2016

上一篇下一篇

猜你喜欢

热点阅读