LeetCode(6):Longest Common Prefix

题目

编写一个函数来查找字符串数组中最长的公共前缀字符串

例子:字符串数组:leets leetcode leet leeds

公共前缀字符串就是Lee

思路1

1.拿第一个和第二个对比,找到最长的,也就是leet
2.在和下一个比较,如果还是leet,则比较下一个字符串;如果不是leet,则去掉最后一位,得到lee,再进行比较

这里写图片描述

public String longestCommonPrefix(String[] strs) {
    if (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.isEmpty()) return "";
        }        
    return prefix;
}

这个思路学习两点:
1.将第一个字符串整个当做一个前缀去和第二个字符串进行比较,而不是一位一位去比较
2.使用strs[i].indexof(prefix)是否等于零来作为判断前缀的依据,很巧妙

思路2

1.纵向比较,取出第一个字符串的第一个字母,和后三个字符串的第一个进行比较,如果都相等,则开始比较第二个字母,直到出现不相等的情况
2.感觉这种比较方法,好像是有一个滑动的游标,在进行移动,移动到不符合条件的时候,将零到游标之间的字符截取下来,就是我们要的值

这里写图片描述

public String longestCommonPrefix(String[] strs) {
    if (strs == null || strs.length == 0) return "";
    for (int i = 0; i < strs[0].length() ; i++){
        char c = strs[0].charAt(i);
        for (int j = 1; j < strs.length; j ++) {
            if (i == strs[j].length() || strs[j].charAt(i) != c)
                return strs[0].substring(0, i);             
        }
    }
    return strs[0];
}
思路3——分而治之

这里写图片描述

思路:一分为二,分别去找最长的前缀,然后在两个前缀中找到最后答案

  public static String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) return "";
        return longestCommonPrefix(strs, 0 , strs.length - 1);
    }

    private static String longestCommonPrefix(String[] strs, int l, int r) {
        if (l == r) {
            return strs[l];
        }
        else {
            int mid = (l + r)/2;
            String lcpLeft =   longestCommonPrefix(strs, l , mid);
            String lcpRight =  longestCommonPrefix(strs, mid + 1,r);
            return commonPrefix(lcpLeft, lcpRight);
        }
    }

     static  String  commonPrefix(String left,String right) {
        int min = Math.min(left.length(), right.length());
        for (int i = 0; i < min; i++) {
            if ( left.charAt(i) != right.charAt(i) )
                return left.substring(0, i);
        }
        return left.substring(0, min);
    }

最后一个代码要好好在理解一下,先在这里记录下来

猜你喜欢

转载自blog.csdn.net/cd18333612683/article/details/79306737