LeetCode 4.最长公共前缀(JAVA)

网址:https://leetcode-cn.com/problems/longest-common-prefix/

题目:

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

示例 1:输入: ["flower","flow","flight"]
           输出: "fl"
示例 2:输入: ["dog","racecar","car"]
           输出: ""
           解释: 输入不存在公共前缀。


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

 

思路和代码:

  • 解法1:转换为char,然后依次比较,暴力破解
     public String longestCommonPrefix(String[] strs) {
        int length = strs.length;
        if(length == 1){
            return strs[0];
        }
        if(length == 0){
            return "";
        }
        String com = compare(strs[0],strs[1]);//先取得前两个的相同字符
        for(int i = 2 ; i < length ; i++){
            if(!strs[i].startsWith(com)){   //如果前缀还不相同,则在进行比较
                com = compare(strs[i - 1],strs[i]);
            }
        }
        return com;
    }
    //返回两个String字符前几位字符相同
    public String compare(String s1,String s2){
        char[] str1 = s1.toCharArray();
        char[] str2 = s2.toCharArray();
        String s = "";
        int length = str1.length > str2.length ? str2.length : str1.length; //去两者较短者的长度

        for(int i = 0; i < length ; i++){
            if(str1[i] != str2[i]){
                return s;
            }
            s = s + str1[i];
        }
        return s;
    }
  • 解法2:使用indexOf方法和subString方法(出自LeetCode官方)

   取得让prefix = strs[0],for循环,while循环,

   在while循环中,判断strs[i]是否包含prefix,

   如果不包含或者不在字符串首,则使用subString方法把prefix的最后一位去掉,继续while循环,直到包含且在字符串首(如果prefix去空了,则表示没有相同子串);

    直到for循环完成,返回prefix,即为最长的公共前缀。

    public String longestCommonPrefix2(String[] strs) {
        if (strs.length == 0) return "";
        String prefix = strs[0];
        for (int i = 1; i < strs.length; i++)
            while (strs[i].indexOf(prefix) != 0) {
                prefix = prefix.substring(0, prefix.length() - 1);
                if (prefix.isEmpty()) return "";
            }
        return prefix;
    }

分析:

很明显解法2比解法1要好上一些。

以后遇到字符串的问题,不要一味的去想转化成char数组然后操作,之前学习忽视了String的一些强大的方法,要好好补牢。


笔记:

  1. indexOf() 返回指定字符第一次出现的字符串内的索引
  2. subString() 返回一个字符串,该字符串是此字符串的子字符串。

    (可以指定前后 可省略后)

  3. isEmpty() 返回String是否为空
  4. startsWith() 判断字符串是否以指定的前缀开始

你可能感兴趣的:(LeetCode)