From 2c41ea320fc8d65e8b2501a611d9ca2fbe75f6e1 Mon Sep 17 00:00:00 2001 From: kingeasternsun Date: Wed, 23 Dec 2020 12:53:01 +0800 Subject: [PATCH] Update 0387.First-Unique-Character-in-a-String.md --- ...0387.First-Unique-Character-in-a-String.md | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/website/content/ChapterFour/0387.First-Unique-Character-in-a-String.md b/website/content/ChapterFour/0387.First-Unique-Character-in-a-String.md index b3ccff4c..6f65a982 100755 --- a/website/content/ChapterFour/0387.First-Unique-Character-in-a-String.md +++ b/website/content/ChapterFour/0387.First-Unique-Character-in-a-String.md @@ -45,4 +45,57 @@ func firstUniqChar(s string) int { return -1 } -``` \ No newline at end of file +``` + +## 思路2 +这个思路只超过81%的用户,但是如果测试样例中s的字符串很长,但是满足条件的字符都在靠后的位置的话,这个思路应该会更有优势 +- 通过记录每个字符的第一次出现的位置和最后一次出现的位置 +- 第一次对s进行一次遍历 +- 第二次仅仅对数组进行遍历就可以了 + +## 代码 + +执行用时: 8 ms +内存消耗: 5.2 MB + + +```go + + +func firstUniqChar(s string) int { + + charMap := make([][2]int, 26) + for i := 0; i < 26; i++ { + charMap[i][0] = -1 + charMap[i][1] = -1 + } + + for i := 0; i < len(s); i++ { + if charMap[s[i]-'a'][0] == -1 { + charMap[s[i]-'a'][0] = i + } else { //已经出现过 + charMap[s[i]-'a'][1] = i + } + + } + + res := len(s) + + for i := 0; i < 26; i++ { + + //只出现了一次 + if charMap[i][0] >= 0 && charMap[i][1] == -1 { + if charMap[i][0] < res { + res = charMap[i][0] + } + } + + } + + if res == len(s) { + return -1 + } + return res +} + +```