最長の共通プレフィックス
トピックリンク:
https://leetcode-cn.com/problems/longest-common-prefix/
タイトル説明
文字列配列内で最も長い共通プレフィックスを見つける関数を記述します。
共通のプレフィックスがない場合は、空の文字列 ""が返されます。
例:
例1:
入力:["flower"、 "flow"、 "flight"]
出力: "fl"
例2:
入力:["dog"、 "racecar"、 "car"]
出力: ""
説明:入力が存在しません共通のプレフィックス。
説明:すべてのエントリには小文字のazのみが含まれています。
解決
アイデア1:時間の複雑さ:O(N * len(strs(0))空間の複雑さ:O(N)
合計N個の文字列があり、タイトルから共通の接頭辞を見つけるように求められます(最長である必要があります)。次に、最初のi + 1文字列の最長の共通プレフィックス(dp [i])がすでにわかっていて、別の文字列(つまり、i + 2番目の文字列)があるとします。私たちは何をする必要がありますか?i +2番目の文字列の前にdp [i]が付いていない場合は、dp [i]の最後の文字を削除して、再試行してください。それがすべて終わったらどうしますか?その場合、最終結果は空の文字列になります。
特定のコードを見てみましょう:
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) {
return "";
}
// 最长字串的长度一定不会超过第 0 个字符串的长度
int end = strs[0].length();
for (int i = 1; i < strs.length; i++){
int j = 0;
while (j < end && j < strs[i].length() && strs[0].charAt(j) == strs[i].charAt(j)) {
j++;
}
end = j;
}
return strs[0].substring(0,end);
}
}
アイデア2:時間の複雑さ:O(N * len(strs(0))空間の複雑さ:O(1)
アイデア1では、各ステップの状態も記録する必要があるため、スペースの複雑さはO(N)ですが、余分なスペースは必要ありませんか?
特定のコードを見てみましょう:
class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) {
return "";
}
for (int i = 0; i < strs[0].length(); i++) {
// 第 0 个字符不需要比较,可以直接从第 1 个字符开始进比较
for (int j = 1; j < strs.length; j++) {
// 只要strs中存在比当前长度i更短的string,立刻返回上一轮LCP,即strs[0][:i]
// 只要strs中存在当前index字符与LCP该index不相同的字符串,立刻返回上一轮LCP,即strs[0][:i]
if (i >= strs[j].length() || strs[0].charAt(i) != strs[j].charAt(i)) {
return strs[0].substring(0, i);
}
}
}
return strs[0]; // 如果一直没返回,说明strs[0]本身就是LCP,返回它
}
}