Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions 3/step1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# step1 何も見ずに解く
文字を前から一つずつみていって、開始時点から今見てるところまでの文字列がすべてユニークな文字を含む文字列かどうかをチェックしたい。
見た文字を管理すれば今見ている文字が既に見たことあるかどうかがわかる。
既に見た文字があるとき、この文字を含む場合どこまで後ろであれば問題ないかを知りたい。
例えばabcdec....という文字列がある時に、二回目のcが来た時にdecは問題ないので次を見に行く、ということをしたい。
それを実現するには、今見ている文字がなくなるまで開始時点を進めればよい。
こういう感じの発想でいけるはず。

時間計算量はO(N)で空間計算量もO(N)
Nの最大値は5 * 10^4なので1秒以内に終わる。

```ruby
# @param {String} str
# @return {Integer}
def length_of_longest_substring(str)
chars_in_substr = Set.new
l = 0
res = 0
str.size.times do |r|
while chars_in_substr.include?(str[r])
chars_in_substr.delete(str[l])
l += 1
end
chars_in_substr << str[r]
res = [res, r - l + 1].max
end
res
end
```
21 changes: 21 additions & 0 deletions 3/step2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# step2 他の方の解答を見る
https://github.com/olsen-blue/Arai60/pull/49
ハッシュテーブルを使う方法

```ruby
# @param {String} str
# @return {Integer}
def length_of_longest_substring(str)
visited_char_to_index = Hash.new(-1)
max_length = 0
left = 0
str.size.times do |right|
left = [left, visited_char_to_index[str[right]] + 1].max
max_length = [max_length, right - left + 1].max
visited_char_to_index[str[right]] = right
end
max_length
end
```

こっちの方がシンプルでわかりやすいかも
17 changes: 17 additions & 0 deletions 3/step3.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# step3 3回続けて10分以内に書いてエラーを出さなければOKとする

```ruby
# @param {String} str
# @return {Integer}
def length_of_longest_substring(str)
visited_char_to_index = Hash.new(-1)
max_size = 0
left = 0
str.size.times do |right|
left = [left, visited_char_to_index[str[right]] + 1].max
max_size = [max_size, right - left + 1].max
visited_char_to_index[str[right]] = right
end
max_size
end

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

良いと思いました。visited_char_to_index は難しいところですが、どういうインデックスかを説明する
char_to_last_index や char_to_last_seen_index もありかもしれません。やや長いので微妙でしょうか。

```
1 change: 1 addition & 0 deletions 3/step4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
## step4 レビューを受けて解答を修正