算法题-求字符串数组中的最长公共前缀

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的每个位置,并检查所有字符串在该位置上的字符是否相同。如果有任何不同,我们就返回当前已经构建的公共前缀;如果都相同,我们就将该字符添加到公共前缀中。最后,如果所有字符串都已经遍历完,我们就返回完整的公共前缀。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThinkPet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值