From 86c00f6ee4e57d46bf994ba1ad6e157491390b8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=82=A2=E3=83=81=E3=83=A7=E3=83=83=E3=83=88?= Date: Sun, 18 Jan 2026 18:09:39 +0900 Subject: [PATCH] Create 387.First Unique Character in a String.md Added detailed explanation and Java implementation for finding the first unique character in a string. --- ...387. First Unique Character in a String.md | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 387.First Unique Character in a String/387. First Unique Character in a String.md diff --git a/387.First Unique Character in a String/387. First Unique Character in a String.md b/387.First Unique Character in a String/387. First Unique Character in a String.md new file mode 100644 index 0000000..660c71b --- /dev/null +++ b/387.First Unique Character in a String/387. First Unique Character in a String.md @@ -0,0 +1,178 @@ +//STEP1 + +■手作業でどうやるか? + +例:loveleetcode + +l→後ろの文字を一つずつ見ていく。だめ + +o→後ろの文字を一つずつ見ていく。だめ + +v→後ろの文字を一つずつ見ていく。OK + +重複を見つけたらNGの文字一覧に放り込んで行く。 + +もしNG一覧にあれば、その文字は調べず、次の文字の重複チェックをする。 + +もしNG一覧になければ、その要素より後を調べる。 + +NGリストはsetにすればいいかな? + + + +```java +class Solution { + public int firstUniqChar(String s) { + Set repeating = new HashSet<>(); + int n = s.length(); + for (int i = 0; i < n; i++) { + char c = s.charAt(i); + if (repeating.contains(c)) { + continue; + } + boolean duplicated = false; + for (int j = i + 1; j < n; j++) { + if (c == s.charAt(j)) { + repeating.add(c); + duplicated = true; + break; + } + } + if (!duplicated) { + return i; + } + } + return -1; + } +} +``` + +■メモ + +初歩的で大変お恥ずかしいですが、 + +やりたいことは構文的なところの知識が足りなかったので、実装がうまくできず + +chatGPTにやりたいことをきれいに実装してもらった後、不明点を調べました。 + +わからないところ、感想など + +・配列のようにインデックスを指定してString中の文字を取得したい + +→インデックスを指定してStringのchar値を返すメソッド charAt + +https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#charAt-int- + +・boolean duplicatedで重複のあるなしを管理しているのは、 + +自分で考えていた時は思いつかなかったが、見やすくていいなと思った。 + +・計算量について + +時間計算量は、O(N^2) (二重のforループ) + +空間計算量は、O(N) (重複文字数に比例してメモリが必要) + + + + + +//STEP2 + +■ほかの人の解答を読む + +Leetcodeの解答例 + +```java +class Solution { + public int firstUniqChar(String s) { + int[] c=new int[26]; + for(int i=0;i counter = new HashMap<>(); + for (int i = 0; i < s.length(); i++) { + counter.put(s.charAt(i), counter.getOrDefault(s.charAt(i), 0) + 1); + //ここは、counters.merge(s.charAt(i), 1, (oldValue, newValue) -> oldValue + newValue); + //でも同じことが可能。 + //ラムダ式というものらしい。 + } + for (int i = 0; i < s.length(); i++) { + if (counter.get(s.charAt(i)) == 1) { + return i; + } + } + return -1; + } +} +```