leetcode探索之旅(14)

最長公共前綴

編寫一個函數(shù)來查找字符串?dāng)?shù)組中的最長公共前綴。
如果不存在公共前綴,返回空字符串 ""。

示例 1:

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

示例 2:

輸入: ["dog","racecar","car"]
輸出: ""
解釋: 輸入不存在公共前綴。

說明:

所有輸入只包含小寫字母 a-z 。

來源:力扣(LeetCode)

先上個人思路和代碼

public class Test14 {
    /**
     * 題目14: 最長公共前綴
     * 編寫一個函數(shù)來查找字符串?dāng)?shù)組中的最長公共前綴。如果不存在公共前綴,則返回""
     */
    public static void main(String[] args) {
        // 思路:先第一組比,得出一個正確的字符串?dāng)?shù)組
        // 后以結(jié)果數(shù)組與下一個元素比較
        // 以此往復(fù),直到返回空字符串或遍歷完數(shù)組

        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();
                // 取兩個數(shù)組中長度最小的值,來遍歷
                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()轉(zhuǎn)成char數(shù)組,依次比較。

其中的思路:取一個字符串做temp,每一次比較將結(jié)果記錄下來。這樣時間復(fù)雜度就是O(n),n是字符串?dāng)?shù)組長度。同時,在遍歷的時候,如果temp結(jié)果在初始化后,又為空,那就可以認為公共前綴已經(jīng)是空字符串了。

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

很好,報錯了。。。

我透。。。

經(jīng)過調(diào)試修改,先看下修改后正確的代碼:

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只會跳出當(dāng)前循環(huán),我沒有考慮到當(dāng)temp已經(jīng)為"",需要跳出整個循環(huán)
  • temp = datum時,需要判斷下是否是初始化狀態(tài),字符串?dāng)?shù)組中是否含有""的情況
  • 我用的是char數(shù)組作為temp,初始化時按最小的char長度初始化。這個時候,如果直接String.valueOf轉(zhuǎn)。在本地看不出來,在leetcode上會出現(xiàn)/U00000空格的情況。所以需要加trim去空格
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容