最长公共前缀

343 阅读2分钟

这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战

leetcode 最长公共前缀

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

如果不存在公共前缀,返回空字符串 ""

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

解题:要查找一个字符串数组内的最长公共前缀,首先这个子字符串得是前缀,然后还得是公共的(就是每个字符串都有),最后还得是最长的。既然是公共的,那么就想办法每次都取出字符串数组里面所有字符串的第一、二、三、n个字符,比较取出的每一批字符,相当于把这个字符串数组列队排好,第一个字符串在第一排,第二个字符串在第二排,以此类推。每次就可以查看第一列(也就是每一排的第一个位置)是不是一样的,一直玩下找第二列、第三列这样,直到发现有一列空了一个位置,或者该列并不完全一样,那么在这之前的每一列都是一样的,就在这里截断获取到的就是最长公共前缀。

public String longestCommonPrefix(String[] strs) {
    int index = 0;
    Set<Character> characters = new HashSet<>();
    while (true) {
        // 每次取出数组内所有字符串的 第一、二、三、n个元素
        // 比较第一批 第二批 的所有字符,遇到有一个不同 那么在这之前的就是最长公共串
        for (String str : strs) {
            // 超长了 完蛋
            if (index > str.length() - 1) {
                return index == 0 ? "" : str.substring(0, index);
            }
            // 取出第n个元素
            characters.add(str.charAt(index));
            // 遇到不相等的了
            if (characters.size() > 1) {
                return index == 0 ? "" : str.substring(0, index);
            }
        }
        index++;
        characters.clear();
    }
}

或者先取出第一个字符串(题目保证数组长度>=1),用第一个字符串和下一个字符串比较,查出这两个字符串的公共前缀,在拿这个前缀去和下一个字符串比较获取公共前缀,这里两两比较最后获取到的的公共前缀就是最长公共前缀。

public String longestCommonPrefix(String[] strs) {
    // 取出数组的第一个字符串(题目保证数组长度>=1)
    String str = strs[0];
    // 拿到一个字符串和后面一个字符串比较 获取公共子串
    // 得到这个公共子串 在和后面一个字符串比较 获取公共子串
    for (int i = 1; i < strs.length; i++) {
        // 下一个字符串
        String strTemp = strs[i];
        int index = 0;
        // 以最小长度为准
        int len = Math.min(str.length(), strTemp.length());
        // 如果没有超长 并且 前缀的字符还是一样 就继续往下一个位置
        while (index < len && str.charAt(index) == strTemp.charAt(index)) {
            index++;
        }
        // 保存好公共前缀
        str = str.substring(0, index);
    }

    return str;
}