Java LeetCode 14。最长公共前缀

Java LeetCode 14。最长公共前缀,java,Java,问题: 编写函数以查找字符串数组中最长的公共前缀字符串。如果没有公共前缀,则返回空字符串“” 例1: 输入:[“花”、“流”、“飞行”] 输出:“fl” 例2: 输入:[“狗”、“赛车”、“汽车”] 输出:“” 说明:输入字符串之间没有公共前缀 代码: 公共类解决方案{ 公共字符串longestCommonPrefix(字符串[]strs){ if(strs==null | | strs.length==0) 返回“”; 对于(int i=0;i您的第一个循环正在对数组第一个字符串中的所有字符执

问题:

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

例1:

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

例2:

输入:[“狗”、“赛车”、“汽车”]
输出:“”

说明:输入字符串之间没有公共前缀

代码:

公共类解决方案{
公共字符串longestCommonPrefix(字符串[]strs){
if(strs==null | | strs.length==0)
返回“”;

对于(int i=0;i您的第一个循环正在对数组第一个字符串中的所有字符执行写操作。第二个循环正在检查数组所有字符串的
i
posistion处的字符。如果字符不匹配,或者字符串的长度与
i
相同,则返回子字符串结果


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

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


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

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

         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);
    }

}
主类{
公共静态void main(字符串[]args){
String[]words={“dog”、“racecar”、“car”};
字符串前缀=通用前缀(单词);
System.out.println(前缀);
//返回空字符串
String[]words2={“dog”、“racecar”、“car”};
字符串prefix2=公共前缀(words2);
System.out.println(prefix2);
//返回“fl”(2个字母)
}
私有静态字符串commonPrefix(字符串[]字){
//普通信件柜台
int计数器=0;
外部:
for(int i=0;i如果(单词[j].length()如果我们先对它们进行排序,那么很容易我们只需要比较向量中的第一个和最后一个元素,
代码就好像,这是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;

    }
};
类解决方案{
公众:
字符串最长通用前缀(矢量和str){
int n=str.size();
如果(n==0)返回“”;
字符串ans=“”;
排序(开始(str),结束(str));
字符串a=str[0];
字符串b=str[n-1];

对于(INTI=0;我仍然感到困惑……如果strs:[“飞行”、“飞行”、“飞行”]为什么返回fl而不是fli?如果不需要第三个和后面的字符串?@beautifuldog如果字符相等,则会检查其他字符串。它会将第一个字符与其他字符串的所有第一个字符进行检查,然后将第二个字符与其他字符串的所有第二个字符进行检查,依此类推,直到找到差异。