Conversation
| int length = s.length(); | ||
| int longest = 0; | ||
| for (int startInd = 0; startInd < length; startInd++) { | ||
|
|
| 時間計算量: O(n) | ||
|
|
||
| * 文字の位置を示すleftとrightをウィンドウとして定義し、先行するrightにより文字を1つずつ走査しながら各文字の最後の出現位置(index)を記録していく | ||
| * 対象文字が記録済(重複)の場合、ウィンドウの始端を最後に記録した位置の1つ先まで進める(対象位置が現在の始端より前であれば動かさない) |
There was a problem hiding this comment.
自分が解いたときは、文字とその文字のウィンドウ内での出現回数を HashMap で記録しておき、出現回数が 0 回になるまで left をインクリメントしていきました。各文字の最後の出現位置を記録する方式のほうが、ポインターを一気に飛ばすことができ、処理が端折れてよいと思います。
There was a problem hiding this comment.
ありがとうございます。たしかにそのような方法もありますね。以下のような実装になるかなと思いました。
たしかに出現位置を記録する方式の方が効率は良いですね。
class Solution {
public int lengthOfLongestSubstring(String s) {
HashMap<Character, Integer> charCount = new HashMap<>();
int left = 0, longest = 0;
for (int right = 0; right < s.length(); right++) {
char rightChar = s.charAt(right);
charCount.put(rightChar, charCount.getOrDefault(rightChar, 0) + 1);
while (charCount.get(rightChar) > 1) {
char leftChar = s.charAt(left);
charCount.put(leftChar, charCount.get(leftChar) - 1);
left++;
}
longest = Math.max(longest, right - left + 1);
}
return longest;
}
}こちらも自力で思いつけなかったので勉強になりました。
|
|
||
| ### 試行1 HashSetに格納する方法 | ||
|
|
||
| 時間計算量: O(n^2) |
There was a problem hiding this comment.
n^2 というけれども、endInd は文字の種類までしか伸びないはずなので、長さを n、文字の種類を k として O(nk) でしょうね。
| public int lengthOfLongestSubstring(String s) { | ||
| int length = s.length(); | ||
| int longest = 0; | ||
| for (int startInd = 0; startInd < length; startInd++) { |
There was a problem hiding this comment.
ありがとうございます。indexと書くようにします。
| class Solution { | ||
| public int lengthOfLongestSubstring(String s) { | ||
| HashMap<Character, Integer> lastIndex = new HashMap<>(); | ||
| int length = s.length(), left = 0, longest = 0; |
There was a problem hiding this comment.
こちら、必要に応じてということですね。
一気に初期化するクセがついてしまっていたので参考にさせていただきます。
|
|
||
| ## Step 3 | ||
| 今度は、時間を測りながら、もう一回書く。 | ||
| アクセプトされたら消すを3回連続できたら問題はOK。 |
There was a problem hiding this comment.
これでいいと思います。ちょっと空行が多いと思います。あまり多くても読む助けにならないので、適切なところを考えてください。
There was a problem hiding this comment.
たしかに言われてみて見返したら空行が多いですね。ご指摘ありがとうございます。
| for (int startInd = 0; startInd < length; startInd++) { | ||
| HashSet<Character> appeared = new HashSet<>(); | ||
|
|
||
| char start = s.charAt(startInd); |
問題
https://leetcode.com/problems/longest-substring-without-repeating-characters/description/
言語
Java
次の問題
387. First Unique Character in a String