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(); } }