14. 最长公共前缀

题目:

思路:

【1】题目要求的是所有字符串的最长公共前缀,那么对应的这个公共前缀必然不可能大于最短的字符串。所以要遍历的字符个数也就被限制了(不会出现数组越界的情况)。其次只有全部字符串都匹配某个字符才会被纳入到前缀里面,如果一旦出现不匹配的情况,那么后面的就不需要遍历了。

代码展示:

//时间0 ms 击败 100%
//内存39.4 MB 击败 54.30%
class Solution {
    public String longestCommonPrefix(String[] strs) {
        String prefix = strs[0];
        for (String s : strs) {
            // 这里的startsWith方法便是判断 字符串s 是否是 prefix的前缀字符串,
            // 如果是的话,就要变更,因为前缀的最大长度取决于最小的字符串
            if (prefix.startsWith(s)) {
                prefix = s;
                continue;
            }
            for (int i = 0; i < prefix.length(); i++) {
                if (s.charAt(i) != prefix.charAt(i)) {
                    // 这里是复制出前缀字符串 与 目标字符串 公共部分 i表示的是长度
                    prefix = new String(Arrays.copyOf(prefix.toCharArray(), i));
                    break;
                }
            }
        }
        return prefix;
    }
}

//时间1 ms击败68.51%
//内存39.1 MB击败95.26%
//时间复杂度:O(mn),其中 m 是字符串数组中的字符串的最小长度,n 是字符串的数量。
//最坏情况下,字符串数组中的每个字符串的每个字符都会被比较一次(限最小长度内)。
//空间复杂度:O(1)。使用的额外空间复杂度为常数。
class Solution {
    public String longestCommonPrefix(String[] strs) {
        int num = strs.length;
        int maxL = Integer.MAX_VALUE;
        String tem = "";
        for (String s : strs){
            maxL = Math.min(maxL, s.length());
            tem = s;
        }

        StringBuffer res = new StringBuffer();
        for (int i = 0; i < maxL; i++){
            for (int j = 0; j < num - 1; j++){
                if (strs[j].charAt(i) != tem.charAt(i))
                    return res.toString();
            }
            res.append(tem.charAt(i));
        }
        return res.toString();
    }
}

 

posted @ 2023-06-25 18:21  忧愁的chafry  阅读(10)  评论(0编辑  收藏  举报