LeetCode: Longest Common Prefix

問題

Write a function to find the longest common prefix string amongst an array of strings. If there is no common prefix, return an empty string "".

解答

大して上手いやり方が思い当たらず、力任せに解くことにしました。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs.length == 0) return "";
        StringBuilder sb = new StringBuilder("");
        char currentChar = 0;
        for (int i = 0; ; i++) {
              for (int j = 0; j < strs.length; j++) {
                  String str = strs[j];
                  if (str.length() <= i) {
                    return sb.toString();
                  }
                  char ch = str.charAt(i);
                  if (j == 0) {
                    currentChar = ch;
                  }
                  if (ch != currentChar) {
                    return sb.toString();
                  }
             }
        sb.append(currentChar);
        }
    }
}

入力される配列のサイズをm、文字列の平均長をnとすると、

時間計算量:O(m x n)、メモリ計算量:O(n)

グラフを見た感じも他の人も同じような戦略のようですね。 f:id:tsukakei1012:20181128114407p:plain

他の人の解答も見てみましょう。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        
        if(strs.length == 0 || strs == null)
        {
            return "";
        }
        
        String longCommonPre = strs[0];
        for(int i = 1;i<strs.length;i++)
        {
            int k = 0;
            String currentItem = strs[i];
            while(k < longCommonPre.length() && k < currentItem.length() && longCommonPre.charAt(k) == currentItem.charAt(k))
            {
                k++;
                
            }
            if( k == 0)
            {
                return "";
            }
            longCommonPre = longCommonPre.substring(0,k);
        }
        
        return longCommonPre;
    }
}

時間計算量:O(m x n)、メモリ計算量:O(n)

やっていることは同じですが、僕のコードの方がわかりやすくないですか?