1.编写一个函数来查找字符串数组中的最长公共前缀,如果不存在公共前缀,返回空字符串"" 。 示例:输入[“flower”,“flow”,“flight”]输出"fl"
在Java中,你可以通过水平扫描(Horizontal Scanning)或者垂直扫描(Vertical Scanning)的方式来解决这个问题。水平扫描是从左到右检查每个字符是否相同,而垂直扫描是首先获取所有字符串的最小长度,然后从第一个字符串开始,逐个字符地与其他字符串进行比较。
水平扫描方案
public class LongestCommonPrefix {public String longestCommonPrefix(String[] strs) {if (strs == null || strs.length == 0) {return "";}// 获取第一个字符串作为公共前缀的起始点String prefix = strs[0];// 遍历剩余字符串,逐个字符与当前公共前缀进行比较for (int i = 1; i < strs.length; i++) {// 如果当前字符串为空,则公共前缀必然为空if (strs[i].isEmpty()) {return "";}// 使用两个指针,分别指向当前字符串和公共前缀int j = 0;// 当两个指针都没有超出边界,并且当前字符相同时,继续比较while (j < prefix.length() && j < strs[i].length() && prefix.charAt(j) == strs[i].charAt(j)) {j++;}// 更新公共前缀为当前比较得到的子串prefix = prefix.substring(0, j);// 如果公共前缀已经为空,则无需继续比较if (prefix.isEmpty()) {break;}}// 返回最终得到的公共前缀return prefix;}public static void main(String[] args) {LongestCommonPrefix solution = new LongestCommonPrefix();String[] strs = {"flower", "flow", "flight"};String result = solution.longestCommonPrefix(strs);System.out.println(result); // 输出: fl}
}
在这个解决方案中,我们首先检查数组是否为空或没有元素,如果是,我们直接返回空字符串。然后,我们获取数组中的第一个字符串作为公共前缀的起始点。接下来,我们遍历数组中的剩余字符串,并逐个字符地与当前公共前缀进行比较。如果当前字符不同或者某个字符串已经遍历完了,我们就更新公共前缀并继续下一个字符串的比较。最后,我们返回得到的公共前缀。
垂直扫描方案
垂直扫描法通常是通过比较所有字符串在同一位置上的字符来实现的。如果某个位置上所有字符串的字符都相同,那么该字符就是公共前缀的一部分;如果某个位置上的字符不完全相同,则停止比较,并将当前位置之前的所有字符作为最长公共前缀。
以下是用Java实现的垂直扫描法:
public class LongestCommonPrefix {public String longestCommonPrefix(String[] strs) {if (strs == null || strs.length == 0) {return "";}// 获取字符串数组中最短的字符串长度,避免越界int minLength = Integer.MAX_VALUE;for (String str : strs) {minLength = Math.min(minLength, str.length());}StringBuilder prefix = new StringBuilder();// 遍历每个字符的位置for (int i = 0; i < minLength; i++) {// 假设当前位置的字符是公共前缀的一部分char currentChar = strs[0].charAt(i);// 检查剩余字符串在同一位置上的字符是否相同for (int j = 1; j < strs.length; j++) {if (i >= strs[j].length() || strs[j].charAt(i) != currentChar) {// 如果有任何不同,返回当前已构建的公共前缀return prefix.toString();}}// 所有字符串在同一位置上的字符都相同,添加到公共前缀中prefix.append(currentChar);}// 如果所有字符串都已经遍历完,返回完整的公共前缀return prefix.toString();}public static void main(String[] args) {LongestCommonPrefix solution = new LongestCommonPrefix();String[] strs = {"flower", "flow", "flight"};String result = solution.longestCommonPrefix(strs);System.out.println(result); // 输出: fl}
}
在这个解决方案中,我们首先找到字符串数组中最短的字符串长度,这样可以避免在遍历过程中访问超出字符串边界的字符。然后,我们使用一个StringBuilder
来构建公共前缀。我们遍历从0开始到最短字符串长度减1的每个位置,并检查所有字符串在该位置上的字符是否相同。如果有任何不同,我们就返回当前已经构建的公共前缀;如果都相同,我们就将该字符添加到公共前缀中。最后,如果所有字符串都已经遍历完,我们就返回完整的公共前缀。