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..a2957c0 --- /dev/null +++ b/387. First Unique Character in a String/note.md @@ -0,0 +1,25 @@ +# step1 +自分で解いた。 + +# step1-1 +すぐに解法が浮かんだ。 +1回目の走査で文字をカウントして、2回目の走査でカウント1のもののindexを返すという考え。 +時間計算量:O(n) n:文字列の長さ、空間計算量:O(n) + +# 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) +マジックナンバーを使わないようにいくつか定数を設定した。 + +# step3 +いただいたコメントを元に修正したもの +特に変数名について意味をもう少し具体的にして、読む人が大体正しくイメージができるくらいにすることを忘れないようにしたい。 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..c29374f --- /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; + } +} 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..dcc345e --- /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; + } +} 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; + } +} 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; + } +} 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; + } +}