🖋

LeetCode 14. Longest Common Prefix

に公開

はじめに

LeetCode 「14. Longest Common Prefix」の問題をGoで解きました。

問題

https://leetcode.com/problems/longest-common-prefix/description/

問題文

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 "".

和訳
文字列の配列から最長の共通接頭辞文字列を見つける関数を書く。

共通の接頭辞がない場合は、空の文字列 "" を返す。

Input: strs = ["flower","flow","flight"]
Output: "fl"
Input: strs = ["dog","racecar","car"]
Output: ""
Explanation: There is no common prefix among the input strings.

制約

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] consists of only lowercase English letters if it is non-empty.

解答

配列から最長の共通接頭辞を求める問題です。

最初の文字列を基準に、各文字の位置(インデックス)を順に比較していきます。
外側のループではインデックス i を進めながら、
内側のループで他の文字列の同じ位置の文字と比較します。

次のいずれかの条件を満たした時点で不一致とみなし、
それまでに一致していた部分(接頭辞)を返します。

  • i が対象の文字列の長さ以上になった場合(文字が存在しない)
  • 同じ位置の文字が一致しなかった場合

コード

func longestCommonPrefix(strs []string) string {
	for i := 0; ; i++ {
		if i >= len(strs[0]) {
			return strs[0]
		}
		ch := strs[0][i]
		for j := 1; j < len(strs); j++ {
			if i >= len(strs[j]) || ch != strs[j][i] {
				return strs[0][:i]
			}
		}
	}
}

計算量

  • 時間的計算量:O(mn)
    • 外側ループ最大回数 m回
    • 内側ループ最大回数 n-1回 (O(n)とみなす)
  • 空間的計算量:O(1)
GitHubで編集を提案

Discussion