leetcode探索之旅(14)

最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。

示例 1:

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

示例 2:

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

说明:

所有输入只包含小写字母 a-z 。

来源:力扣(LeetCode)

先上个人思路和代码

public class Test14 {
    /**
     * 题目14: 最长公共前缀
     * 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,则返回""
     */
    public static void main(String[] args) {
        // 思路:先第一组比,得出一个正确的字符串数组
        // 后以结果数组与下一个元素比较
        // 以此往复,直到返回空字符串或遍历完数组

        String [] data = new String[] {"abc","abcass","abcaww"};
        String result = solution(data);
        System.out.println(result);
    }

    public static String solution(String[] data) {
        if (data.length < 1) {
            return "";
        }
        if (data.length == 1) {
            return data[0];
        }
        String  temp = "";
        for (String datum : data) {
            if ("".equals(temp)) {
                temp = datum;
            } else {
                char[] chars = temp.toCharArray();
                char[] chars1 = datum.toCharArray();
                // 取两个数组中长度最小的值,来遍历
                int size = Math.min(chars.length, chars1.length);
                char[] result = new char[size];
                for (int i = 0; i < size; i++) {
                    if (chars[i] == chars1[i]) {
                        result[i] = chars[i];
                    } else {
                        break;
                    }
                }
                temp = String.valueOf(result);
            }
        }
        return temp;
    }
}

我的思路很简单,比最长公共前缀,实际比较的方法就是,String.toCharArray()转成char数组,依次比较。

其中的思路:取一个字符串做temp,每一次比较将结果记录下来。这样时间复杂度就是O(n),n是字符串数组长度。同时,在遍历的时候,如果temp结果在初始化后,又为空,那就可以认为公共前缀已经是空字符串了。

然后,我们到Leetcode上跑下。。。。

很好,报错了。。。

我透。。。

经过调试修改,先看下修改后正确的代码:

public static String solution(String[] data) {
        if (data.length < 1) {
            return "";
        }
        if (data.length == 1) {
            return data[0];
        }
        String  temp = "";
        boolean flag = false;
        for (int i = 0; i < data.length && !flag; i++) {
            String datum = data[i];
            if ("".equals(temp)  && i == 0 && !"".equals(datum)) {
                temp = datum;
            } else {
                char[] chars = temp.toCharArray();
                char[] chars1 = datum.toCharArray();
                int size = Math.min(chars.length, chars1.length);
                char[] result = new char[size];
                for (int j = 0; j < size; j++) {
                    if (chars[j] == chars1[j]) {
                        result[j] = chars[j];
                    } else {
                        if ("".equals(temp)) {
                            flag = true;
                        }
                        break;
                    }
                }
                temp = String.valueOf(result).trim();
            }
        }
        return temp;
    }

注意:刚开始的代码,错了大致三个地方

  • break只会跳出当前循环,我没有考虑到当temp已经为"",需要跳出整个循环
  • temp = datum时,需要判断下是否是初始化状态,字符串数组中是否含有""的情况
  • 我用的是char数组作为temp,初始化时按最小的char长度初始化。这个时候,如果直接String.valueOf转。在本地看不出来,在leetcode上会出现/U00000空格的情况。所以需要加trim去空格

你可能感兴趣的:(leetcode探索之旅(14))