LeetCode 14.最长公共前缀

时间:2019-03-23 21:07:12

标签: java

问题:

编写一个函数以在字符串数组中找到最长的公共前缀字符串。如果没有公共前缀,则返回一个空字符串“”。

示例1:

输入:[“花”,“流”,“飞行”]
输出:“ fl”

示例2:

输入:[“ dog”,“ racecar”,“ car”]
输出:“”

说明:输入字符串之间没有通用前缀。

代码:

public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs==null || strs.length==0)
            return "";
        for(int i=0;i<strs[0].length();i++) {
            char x = strs[0].charAt(i);
            for(int j=0;j<strs.length;j++) {
                if((strs[j].length()==i)||(strs[j].charAt(i)!=x)) {
                    return strs[0].substring(0,i);
                }
            }
        }
        return strs[0];
    }
}

这是第二种解决方案,但我不了解内部循环。 我认为,如果strs中的第二个元素返回一个字符串并结束for循环,则第三个元素将没有机会进行比较。

4 个答案:

答案 0 :(得分:0)

您的第一个循环遍历数组第一个字符串中的所有字符。第二个循环是在数组的所有字符串的i置换中检查char。如果字符不匹配,或者字符串的长度与i相同,则返回子字符串结果。

我认为最好的理解方法是调试此示例。

答案 1 :(得分:0)

如果第二个字符串中的char与第一个字符串中的char不同,则返回是正确的,因为这意味着公共前缀在此结束。不需要检查第三和后面的字符串。

基本上,一旦找到不匹配的字符,它就会返回。

答案 2 :(得分:0)

您必须在所有单词中检查相同的位置,然后进行比较。

         positions
word    0 1 2 3 4 5
=====================
w[0]    F L O W E R
w[1]    F L O W
w[2]    F L I G H T

在Java中:

class Main {

    public static void main(String[] args) {
        String[] words = {"dog","racecar","car"};

        String prefix = commonPrefix(words);

        System.out.println(prefix);
        // return empty string

        String[] words2 = {"dog","racecar","car"};

        String prefix2 = commonPrefix(words2);

        System.out.println(prefix2);
        // Return "fl" (2 letters)
    }

    private static String commonPrefix(String[] words) {
        // Common letter counter
        int counter = 0;

        external:
        for (int i = 0; i < words[0].length(); i++) {

            // Get letter from first word
            char letter = words[0].charAt(i);

            // Check rest of the words on that same positions
            for (int j = 1; j < words.length; j++) {
                // Break when word is shorter or letter is different
                if (words[j].length() <= i || letter != words[j].charAt(i)) {
                    break external;
                }
            }

            // Increase counter, because all of words
            // has the same letter (e.g. "E") on the same position (e.g. position "5")
            counter++;
        }

        // Return proper substring
        return words[0].substring(0, counter);
    }

}

答案 3 :(得分:0)

如果我们首先对它们进行排序,那将非常容易,我们只需要去比较存在的向量中的第一个和最后一个元素,因此, 代码就像,这是实现的C ++代码。

class Solution {
public:
    string longestCommonPrefix(vector<string>& str) {
        int n = str.size();
        if(n==0) return "";

        string ans  = "";
        sort(begin(str), end(str));
        string a = str[0];
        string b = str[n-1];

        for(int i=0; i<a.size(); i++){
            if(a[i]==b[i]){
                ans = ans + a[i];
            }
            else{
                break;
            }
        }

        return ans;

    }
};