Leetcode - Longest Common Prefix

Question:

Paste_Image.png

My code:

public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null)
            return null;
        if (strs.length == 0)
            return "";
        if (strs.length == 1)
            return strs[0];
        
        int minLength = Integer.MAX_VALUE;
        for (int i = 0; i < strs.length; i++) {
            if (minLength > strs[i].length())
                minLength = strs[i].length();
        }
        
        String result = "";
        boolean isOver = false;
        for (int i = 0; i < minLength; i++) {
            for (int j = 0; j < strs.length - 1; j++) {
                if (strs[j].charAt(i) != strs[j + 1].charAt(i)) {
                    isOver = true;
                    break;
                }
            }
            if (!isOver)
                result += strs[0].charAt(i);
            else
                break;
        }
        return result;
    }
}

My test result:

Paste_Image.png

侮辱智商的题目。不爆粗口了。

**
总结:简书,你上传照片这一个功能怎么老是这么卡。优化下行吗?
**

Anyway, Good luck, Richardo!

这道题目竟然没做出来,感觉自己的思考能力越来越差了,碰到新题,第一个想到的就是看答案。
this is not right!

My code:

Horizontal scanning

public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        
        String prefix = strs[0];
        for (int i = 1; i < strs.length; i++) {
            while (strs[i].indexOf(prefix) != 0) {
                prefix = prefix.substring(0, prefix.length() - 1);
                if (prefix.length() == 0) {
                    return "";
                }
            }
        }
        return prefix;
    }
}

Vertical Scanning
My code:

public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        
        int i = 0;
        while (i < strs[0].length()) {
            char curr = strs[0].charAt(i);
            for (int j = 1; j < strs.length; j++) {
                if (i < strs[j].length() && strs[j].charAt(i) == curr) {
                    continue;
                }
                else {
                    return strs[0].substring(0, i);
                }
            }
            i++;
        }
        return strs[0];
    }
}

reference:
https://leetcode.com/articles/longest-common-prefix/

这篇文章分析的很好。
还有两种方法:
一个是 divide and conquer,把strs[] 分成两块去找LCP,然后再merge
一个是 binary search, 先找到最短字符串,s[0, end]
然后看 s[0, mid] 是不是 CP,
如果是, begin = mid,
如果不是, end = mid - 1
以此类推。

然后最后有个follow up,
如果给定一个 strs[], 还有一个输入string p,
找 p 在 strs[] 中的LCP
怎么做?

最快的方法就是建Trie,然后顺着 p 在Trie里面走下去,每走一步,当前结点必须只有一个link,而且必须不是end point
然后找到 LCP

然后还有种方法解决这道题目。
将 strs[] 全部排序,然后比较第一个和最后一个字符串,找 LCP

My code:

public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        
        Arrays.sort(strs);
        String s1 = strs[0];
        String s2 = strs[strs.length - 1];
        int i = 0;
        for (; i < s1.length(); i++) {
            if (i < s2.length() && s1.charAt(i) == s2.charAt(i)) {
                continue;
            }
            else {
                break;
            }
        }
        return s1.substring(0, i);
    }
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容