From 7dc074e43dd4c62a8de4763740a249b70edeee9f Mon Sep 17 00:00:00 2001 From: ryo <34418898+ryoooooory@users.noreply.github.com> Date: Thu, 12 Sep 2024 23:31:47 +0900 Subject: [PATCH 01/11] Create step1-1.java --- .../step1-1.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 387. First Unique Character in a String/step1-1.java diff --git a/387. First Unique Character in a String/step1-1.java b/387. First Unique Character in a String/step1-1.java new file mode 100644 index 0000000..6b036ad --- /dev/null +++ b/387. First Unique Character in a String/step1-1.java @@ -0,0 +1,17 @@ +class Solution { + // leetcode + public int firstUniqChar(String s) { + Map indices = new HashMap<>(); + for(int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + indices.put(c, indices.getOrDefault(c, 0) + 1); + } + for(int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (indices.get(c) == 1) { + return i; + } + } + return -1; + } +} From c9efa6b0b564c1ac72c8e98ea0f4a65d868c98d8 Mon Sep 17 00:00:00 2001 From: ryo <34418898+ryoooooory@users.noreply.github.com> Date: Thu, 12 Sep 2024 23:32:35 +0900 Subject: [PATCH 02/11] Create step1-2.java --- .../step1-2.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 387. First Unique Character in a String/step1-2.java diff --git a/387. First Unique Character in a String/step1-2.java b/387. First Unique Character in a String/step1-2.java new file mode 100644 index 0000000..39df626 --- /dev/null +++ b/387. First Unique Character in a String/step1-2.java @@ -0,0 +1,17 @@ +class Solution { + // leetcode + public int firstUniqChar(String s) { + int[] cs = new int[26]; + for(int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + cs[c - 'a']++; + } + for(int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (cs[c - 'a'] == 1) { + return i; + } + } + return -1; + } +} From 15e376f17c00e11156050054907e1c5a9692e160 Mon Sep 17 00:00:00 2001 From: ryo <34418898+ryoooooory@users.noreply.github.com> Date: Thu, 12 Sep 2024 23:42:43 +0900 Subject: [PATCH 03/11] Create note.md --- 387. First Unique Character in a String/note.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 387. First Unique Character in a String/note.md diff --git a/387. First Unique Character in a String/note.md b/387. First Unique Character in a String/note.md new file mode 100644 index 0000000..e6d43ba --- /dev/null +++ b/387. First Unique Character in a String/note.md @@ -0,0 +1,14 @@ +# step1 +自分で解いた。 + +# step1-1 +すぐに解法が浮かんだ。 +1回目の走査で文字をカウントして、2回目の走査でカウント1のもののindexを返すという考え。 +時間計算量:O(n) n:文字列の長さ、空間計算量:O(n) + +# step1-2 +次に解法が浮かんだ。小文字英字しか使わないパターンはよく使われるイメージ。ただ実際の入力は英小文字以外も入ってるくる可能性があるので、条件を交渉するか1改善案くらいのイメージ。 +時間計算量:O(n) n:文字列の長さ、空間計算量:O(1) + +# step2 +他の人、もしくは回答をみて参考にしたもの From 60bf09f53ac8013c0e1ca686e0959d121ba5d050 Mon Sep 17 00:00:00 2001 From: ryo <34418898+ryoooooory@users.noreply.github.com> Date: Thu, 12 Sep 2024 23:44:01 +0900 Subject: [PATCH 04/11] Update step1-2.java --- 387. First Unique Character in a String/step1-2.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/387. First Unique Character in a String/step1-2.java b/387. First Unique Character in a String/step1-2.java index 39df626..dcc345e 100644 --- a/387. First Unique Character in a String/step1-2.java +++ b/387. First Unique Character in a String/step1-2.java @@ -2,11 +2,11 @@ class Solution { // leetcode public int firstUniqChar(String s) { int[] cs = new int[26]; - for(int i = 0; i < s.length(); i++) { + for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); cs[c - 'a']++; } - for(int i = 0; i < s.length(); i++) { + for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (cs[c - 'a'] == 1) { return i; From df475cffc16b373a28f534de36b5998ae9920ffe Mon Sep 17 00:00:00 2001 From: ryo <34418898+ryoooooory@users.noreply.github.com> Date: Thu, 12 Sep 2024 23:44:14 +0900 Subject: [PATCH 05/11] Update step1-1.java --- 387. First Unique Character in a String/step1-1.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/387. First Unique Character in a String/step1-1.java b/387. First Unique Character in a String/step1-1.java index 6b036ad..c29374f 100644 --- a/387. First Unique Character in a String/step1-1.java +++ b/387. First Unique Character in a String/step1-1.java @@ -2,11 +2,11 @@ class Solution { // leetcode public int firstUniqChar(String s) { Map indices = new HashMap<>(); - for(int i = 0; i < s.length(); i++) { + for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); indices.put(c, indices.getOrDefault(c, 0) + 1); } - for(int i = 0; i < s.length(); i++) { + for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (indices.get(c) == 1) { return i; From cb43b3d927931fb10860c657e9895c8dae5471a1 Mon Sep 17 00:00:00 2001 From: ryo <34418898+ryoooooory@users.noreply.github.com> Date: Fri, 13 Sep 2024 00:06:19 +0900 Subject: [PATCH 06/11] Update note.md --- 387. First Unique Character in a String/note.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/387. First Unique Character in a String/note.md b/387. First Unique Character in a String/note.md index e6d43ba..9c25bc7 100644 --- a/387. First Unique Character in a String/note.md +++ b/387. First Unique Character in a String/note.md @@ -9,6 +9,12 @@ # step1-2 次に解法が浮かんだ。小文字英字しか使わないパターンはよく使われるイメージ。ただ実際の入力は英小文字以外も入ってるくる可能性があるので、条件を交渉するか1改善案くらいのイメージ。 時間計算量:O(n) n:文字列の長さ、空間計算量:O(1) +実行時間がかなりはやくなったのはboxing/unboxingのオーバーヘッドのせいかなと予想。 # step2 他の人、もしくは回答をみて参考にしたもの + +# step2-1 +https://github.com/seal-azarashi/leetcode/pull/15/files +を参考にした。特に入力条件としてサロゲートなどを意識できていなかったので大変勉強になった。(odaさんのコメントのこちらも:https://note.com/ttuusskk/n/n1bff5d8e638c) +マジックナンバーを使わないようにいくつか定数を設定した。 From db53a63abfc5997f5ac50109df20a389d7b886ed Mon Sep 17 00:00:00 2001 From: ryo <34418898+ryoooooory@users.noreply.github.com> Date: Fri, 13 Sep 2024 00:08:23 +0900 Subject: [PATCH 07/11] Create step2-1.java --- .../step2-1.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 387. First Unique Character in a String/step2-1.java diff --git a/387. First Unique Character in a String/step2-1.java b/387. First Unique Character in a String/step2-1.java new file mode 100644 index 0000000..ffc42c3 --- /dev/null +++ b/387. First Unique Character in a String/step2-1.java @@ -0,0 +1,21 @@ +class Solution { + // leetcode + private static final int ALPHABET_SIZE = 26; + private static final char ALPHABET_OFFSET = 'a'; + public static final int NOT_FOUND = -1; + + public int firstUniqChar(String s) { + int[] frequency = new int[ALPHABET_SIZE]; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + frequency[c - ALPHABET_OFFSET]++; + } + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (frequency[c - ALPHABET_OFFSET] == 1) { + return i; + } + } + return NOT_FOUND; + } +} From 734e0dba072f11dbbae238203387bcb67b4edd69 Mon Sep 17 00:00:00 2001 From: ryo <34418898+ryoooooory@users.noreply.github.com> Date: Fri, 13 Sep 2024 00:11:12 +0900 Subject: [PATCH 08/11] Update note.md --- 387. First Unique Character in a String/note.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/387. First Unique Character in a String/note.md b/387. First Unique Character in a String/note.md index 9c25bc7..952e8b2 100644 --- a/387. First Unique Character in a String/note.md +++ b/387. First Unique Character in a String/note.md @@ -7,7 +7,8 @@ 時間計算量:O(n) n:文字列の長さ、空間計算量:O(n) # step1-2 -次に解法が浮かんだ。小文字英字しか使わないパターンはよく使われるイメージ。ただ実際の入力は英小文字以外も入ってるくる可能性があるので、条件を交渉するか1改善案くらいのイメージ。 +次に解法が浮かんだ。小文字英字しか使わないパターンでは配列を使ったカウントがよく使われるイメージだったのですぐ実装できた。 +ただ実際の入力は英小文字以外も入ってるくる可能性があるので、条件を交渉するか1改善案くらいのイメージ。 時間計算量:O(n) n:文字列の長さ、空間計算量:O(1) 実行時間がかなりはやくなったのはboxing/unboxingのオーバーヘッドのせいかなと予想。 From 6cfaf860752fd398fd16959e6e7b3a9da3f7f3ec Mon Sep 17 00:00:00 2001 From: ryo <34418898+ryoooooory@users.noreply.github.com> Date: Sun, 15 Sep 2024 11:14:02 +0900 Subject: [PATCH 09/11] Create step3-1.java --- .../step3-1.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 387. First Unique Character in a String/step3-1.java diff --git a/387. First Unique Character in a String/step3-1.java b/387. First Unique Character in a String/step3-1.java new file mode 100644 index 0000000..be3fef0 --- /dev/null +++ b/387. First Unique Character in a String/step3-1.java @@ -0,0 +1,21 @@ +class Solution { + // leetcode + private static final int NUM_ALPHABETS = 26; + private static final char ALPHABET_OFFSET = 'a'; + public static final int NOT_FOUND = -1; + + public int firstUniqChar(String s) { + int[] frequencies = new int[NUM_ALPHABETS]; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + frequencies[c - ALPHABET_OFFSET]++; + } + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (frequencies[c - ALPHABET_OFFSET] == 1) { + return i; + } + } + return NOT_FOUND; + } +} From ca5616096286de7f704910558f858cc5887b3d05 Mon Sep 17 00:00:00 2001 From: ryo <34418898+ryoooooory@users.noreply.github.com> Date: Sun, 15 Sep 2024 11:14:58 +0900 Subject: [PATCH 10/11] Create step3-2.java --- .../step3-2.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 387. First Unique Character in a String/step3-2.java diff --git a/387. First Unique Character in a String/step3-2.java b/387. First Unique Character in a String/step3-2.java new file mode 100644 index 0000000..73cb4b4 --- /dev/null +++ b/387. First Unique Character in a String/step3-2.java @@ -0,0 +1,17 @@ +class Solution { + // leetcode + public int firstUniqChar(String s) { + Map characterToFrequencies = new HashMap<>(); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + characterToFrequencies.put(c, characterToFrequencies.getOrDefault(c, 0) + 1); + } + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (characterToFrequencies.get(c) == 1) { + return i; + } + } + return -1; + } +} From 441303e3cc647b5380b08043dcba1ff2cc98f3f9 Mon Sep 17 00:00:00 2001 From: ryo <34418898+ryoooooory@users.noreply.github.com> Date: Sun, 15 Sep 2024 11:17:12 +0900 Subject: [PATCH 11/11] Update note.md --- 387. First Unique Character in a String/note.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/387. First Unique Character in a String/note.md b/387. First Unique Character in a String/note.md index 952e8b2..a2957c0 100644 --- a/387. First Unique Character in a String/note.md +++ b/387. First Unique Character in a String/note.md @@ -19,3 +19,7 @@ https://github.com/seal-azarashi/leetcode/pull/15/files を参考にした。特に入力条件としてサロゲートなどを意識できていなかったので大変勉強になった。(odaさんのコメントのこちらも:https://note.com/ttuusskk/n/n1bff5d8e638c) マジックナンバーを使わないようにいくつか定数を設定した。 + +# step3 +いただいたコメントを元に修正したもの +特に変数名について意味をもう少し具体的にして、読む人が大体正しくイメージができるくらいにすることを忘れないようにしたい。